console.log(Star.prototype.constructor); console.log(ldh.__proto__.constructor); //打印的是一样的 都是Star这个函数自身 对象原型或者原型对象.constructor都指向构造函数
Prototype自身就是一个对象 一个自带的内置的对象 这就是为什么它被叫做原型对象
function Star(uname, age) { this.uname = uname; this.age = age; } Star.prototype = { //这是在创建对象 不懂的话看文档最最开始 3种创建对象的办法之一 这是字面量办法 //当前记住看到前面跟花括号 就是创建对象! //Star.protype自身就是一个对象别忘了 因为prototype本身就是一个对象属性 是自带的 内置的 //那么这一段代码其实进行了一个赋值操作 也就是说利用了前面的sing和movie将这个prototype对象给笼罩掉了 // 笼罩完了当前就没有star.constructor 这个属性了 sing: function () { console.log('我能唱歌'); }, movie: function () { console.log('我能演电影'); } } console.log(Star.prototype);//输入后果为sing movie两个function 理由很简略 赋值笼罩掉了呗 function Star(uname, age) { this.uname = uname; this.age = age; } Star.prototype = { //这是在创建对象 不懂的话看文档最最开始 3种创建对象的办法之一 这是字面量办法 //当前记住看到前面跟花括号 就是创建对象! //Star.protype自身就是一个对象别忘了 因为prototype本身就是一个对象属性 是自带的 内置的 //概括来说就是 如果咱们批改了原来的原型对象,给原型对象等于了一个花括号 也就是说通过赋值笼罩了这个原型对象 咱们须要手动指回原来的构造函数 办法就是在赋值笼罩的时候写constructor:Star(不肯定是Star 冒号前面跟构造函数名称) //那么这一段代码其实进行了一个赋值操作 也就是说利用了前面的sing和movie将这个prototype对象给笼罩掉了 // 笼罩完了当前就没有star.constructor 这个属性了 constructor: Star, //增加下面这一行的代码之后 //就相当于手动指回原来的构造函数(那个uname age) //console.log(Star.protype.constructor) 返回Star这个原来的构造函数
总结一下,在咱们的原型prototype外面 有一个属性叫constructor ,这个constructor(找爹仪器 找爹探头)能够通知咱们你这个原型对象(儿子)是通过哪个构造函数(爹)创立进去的。当原型对象(儿子)被你做了对象的赋值操作 /笼罩之后,那原来的constructor属性就被笼罩掉了 (就没了)要让原型对象(儿子)从新找到构造函数(爹) 须要咱们手动指回,办法是在赋值笼罩的花括号外面写constructor:Star(爹的名字)