美文网首页
JavaScript中对象的constructor的深入理解

JavaScript中对象的constructor的深入理解

作者: 陈学谦_ | 来源:发表于2017-04-18 20:37 被阅读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属性直接指向其构造器”的假象。

    相关文章

      网友评论

          本文标题:JavaScript中对象的constructor的深入理解

          本文链接:https://www.haomeiwen.com/subject/gfquuttx.html