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(爹的名字)