felix-cao / Blog

A little progress a day makes you a big success!
31 stars 4 forks source link

JavaScript的constructor属性 #53

Open felix-cao opened 6 years ago

felix-cao commented 6 years ago

constructor 属性始终指向创建当前对象的构造函数。

var str = '';
console.log('str:', str.constructor);
var num = 12;
console.log('num:', num.constructor);
var bool = false;
console.log('bool:', bool.constructor);
var obj = {};
console.log('obj:', obj.constructor);
var arr = [];
console.log('arr:', arr.constructor);

function Person() {};
var objNew = new Person()
console.log('objNew', objNew.constructor);
console.log('constructor', Person.constructor);

constructor属性和prototype属性

JavaScript原型、原型对象、隐式原型 中,我们知道每个函数都有prototype属性,prototype属性的constructor属性会指向这个函数本身。

function Person() {}
Person.prototype.sayName=function() {}
var person = new Person();

console.log(person.constructor); // ƒ Person() {}
console.log(Person.prototype.constructor); // ƒ Person() {}
console.log(Person.constructor); // ƒ Function() { [native code] }

如果我们重写(重新定义)这个Person.prototype属性,那么constructor属性的指向就会发生改变了。

function Person() {}
// Person的原型被重新赋值
Person.prototype = {
    sayName: function() {}
}
var person = new Person();

console.log(person.constructor); // ƒ Object() { [native code] }
console.log(Person.prototype.constructor); // ƒ Object() { [native code] }
console.log(Person.constructor); // ƒ Function() { [native code] }

// 看到了吧,Person.prototype.constructor的指向已经发生了改变了
// Person的原型被重新赋值, 可以这么来指向Object
Person.prototype = new Object(){
    sayName: function() {}
}

// 再次赋值指向Person
Person.prototype.constructor = Person;