JavaScript中对象的constructor的深入理解

2017-04-18  本文已影响192人  陈学谦_

第一次见到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属性直接指向其构造器”的假象。

上一篇 下一篇

猜你喜欢

热点阅读