第一次见到constructor是在张容铭的《JavaScript设计模式》中看到的,当时认为constructor就是对象的构造器,如下图的关系
即“对象.constructor === 构造函数”但我发现我单纯了。看下面代码
// 声明一个构造函数Person。
var Person = function () {};
// 将构造函数Person的prototype属性更改。
Person.prototype = {
getName : function () {}
};
var p = new Person();
console.log(p.constructor === Person); // false
按理来说我只是改变了构造函数Person的prototype属性,并没有改变对象p的constructor属性,p的constructor属性应该仍指向Person。
这说明对象的constructor属性与其构造器的prototype属性有关。
console.log(p.constructor === Person.prototype.constructor); // true
说明对象的constructor属性不是直接指向其构造器,而是通过原型链找到其构造器。也就是对象的constructor属性指向其原型链的上一层的constructor
如图
因此代码
Person.prototype = {
getName : function () {}
};
已经将Person.prototype重写了,给其赋值了一个对象直接量
{
getName : function () {}
}
则此时Person.prototype就是一个使用对象直接量方式定义的对象,而其构造器(constructor)指向根构造器Object
验证一下
console.log(p.constructor === Object); // true
对象p的constructor属性指向 p.proto.constructor,即p.constructor === p.proto.constructor,因为p.proto === Person.prototype,而Person.prototype.constructor === Person,所以才有的p.constructor === Person。因此我们经常会有“对象的constructor属性直接指向其构造器”的假象。
网友评论