/**
* 原型 的构造函数 constructor
* constructor: 称为 构造函数,指回构造函数本身
*
* 其实就是告诉我们 我们这个对象 通过哪个 构造函数 创造出来的
* 1.对象原型(__proto__)和 构造函数(prototype)原型对象 里面都有一个 constructor属性
* 2.constructor 主要用于记录 该对象引用了 哪个构造函数, 让原型对象重新指向原来的构造函数
* 3.如果我们修改了原来的原型对象,给原型对象赋值的是一个对象,则必须手动利用constructor指回原来的构造函数
*/
function Star(name,age) {
this.name = name;
this.age = age;
}
// 很多情况下,我们需要手动的利用constructor 这个属性 指回 原来的构造函数
/**
* 这种方式 直接在prototype原型对象上添加方法sing 和 movie
* 打印的构造函数 指向的 Star构造函数:
* console.log(Star.prototype.constructor);
console.log(yy.__proto__.constructor);
ƒ Star(name,age) {
this.name = name;
this.age = age;
}
ƒ Star(name,age) {
this.name = name;
this.age = age;
}
*/
Star.prototype.sing = function() {
console.log('唱歌')
};
Star.prototype.movie = function() {
console.log('电影')
}
/**
* 第二种表达方式:
* 我们修改了原来的原型对象,给原型对象赋值的事一个对象 如下:
*
* 如果不添加 constructor: Star
console.log(Star.prototype.constructor);
console.log(yy.__proto__.constructor);
ƒ Object() { [native code] }
VM22694:6 ƒ Object() { [native code] }
如果添加 constructor: Star 将手动指回 构造函数 Star
*/
Star.prototype = {
constructor: Star, // 利用constructor 这个属性 指回 原来的构造函数
sing: function() {
console.log('唱歌')
},
movie: function() {
console.log('电影')
}
}
var yy = new Star('yy',19); // 通过构造函数创建的对象实例
var hh = new Star('hh',17);
console.log(Star.prototype, 'p'); // 打印构造函数的 prototype原型对象
console.log(yy.__proto__); // 打印 对象的__proto__对象
/**
* {sing: ƒ, constructor: ƒ}
sing: ƒ ()
constructor: ƒ Star(name,age)
__proto__: Object
}
*/
/**
* {sing: ƒ, constructor: ƒ}
sing: ƒ ()
constructor: ƒ Star(name,age)
__proto__: Object
*/
console.log(Star.prototype.constructor);
console.log(yy.__proto__.constructor);
/**
* ƒ Star(name,age) {
this.name = name;
this.age = age;
}
ƒ Star(name,age) {
this.name = name;
this.age = age;
}
*/