【问题标题】:What is the difference between prototype.constructor and built-in Object()prototype.constructor 和内置的 Object() 有什么区别
【发布时间】:2015-08-07 23:27:03
【问题描述】:

原型是一个对象,您创建的每个函数都会自动获得一个原型属性,该属性指向一个新的空白对象。此对象几乎与使用对象字面量或 Object() 构造函数创建的对象相同,只是它的构造函数属性指向您创建的函数,而不是内置的 Object()。

以上内容摘自 Stoyan Stefanov 的 JavaScript 模式书。

var Ctor = function(msg) { 
    this.msg = msg;
    this.print = function() {
        console.log(this.msg);
    }
};

所以,我知道Ctor 将有一个prototype 属性,我可以访问它。要检查构造函数属性指向的位置,我可以这样做:

Ctor.prototype.constructor

如果我在控制台上执行此操作,我会得到指向 function Ctor(msg) 的指针 (?) 到目前为止,一切都很好。 现在我正在尝试通过Object()构造函数创建一个变量,并查看它的构造函数属性指向的位置:

var CtorCopy = new Object(Ctor);
CtorCopy.prototype.constructor;

现在我看到控制台上的结果是function Ctor(msg),就像之前的情况一样。 因此,这让我得出结论,通过 Object() 创建的对象的构造函数属性并不指向内置 Object() (实际上,我不确定内置 Object() 的含义)而是指向函数我创建。 这令人困惑。

【问题讨论】:

    标签: javascript oop constructor


    【解决方案1】:

    您在问题开头引用的文字是指通过您定义的构造函数创建对象与使用以下内容之间的区别:

    var obj = new Object();
    // or
    var obj = {};
    

    通过将值传递给 Object,您正在调用不同的行为,这会导致它创建该类型的对象。根据 MDN:

    Object 构造函数为给定值创建一个对象包装器。如果值为 null 或未定义,它将创建并返回一个空对象,否则,它将返回一个与给定值对应的类型的对象。如果该值已经是一个对象,它将返回该值。

    所以基本上你已经设法用更多的代码来做同样的事情,就像我上面的例子一样。 See here - MDN.

    【讨论】:

      【解决方案2】:

      根据MDN(强调我的):

      Object 构造函数为给定值创建一个对象包装器。如果值为 null 或未定义,它将创建并返回一个空对象,否则,它将返回一个与给定值对应的类型的对象。 如果该值已经是一个对象,它将返回该值。

      这意味着如果您将 Ctor 函数(它是一个对象)传递给 Object 构造函数,它只会将原始函数返回给您。您正在查看两个相同的对象。

      【讨论】:

        【解决方案3】:

        您问题中的上述引用只是说,每当您创建一个函数时,它都会附加一个原型属性,该属性指向一个对象,其性质几乎与使用内置创建的对象相同对象函数或文字。

        var obj = {};
        // or
        var obj = new Object();
        

        不同之处在于,它的构造函数属性指向您的 Ctor 函数,而不是内置的 Object 函数。如果您执行以下操作,您可以看到差异。

        var Ctor = function(msg) { 
          this.msg = msg;
          this.print = function() {
            console.log(this.msg);
          }
        };
        console.log(typeof Ctor.prototype) // object
        

        所以原型就是这样一个对象。

        console.log(typeof {}); // object
        

        但是它的constructor属性会指向你的函数,...

        console.log(Ctor.prototype.constructort); // function Ctor()
        

        如下将指向内置对象函数。

        var obj = {};
        console.log(obj.constructor); // function Object()
        

        由于所有对象都是Object的后代,它们都继承了Object.prototype的方法和属性。因此,如果您想知道使用哪个原型来实例化您的 Ctor 对象,您可以这样做

        console.log(Ctor.prototype.__proto__); // Object {}
        

        这将为您提供内置对象。

        这将解释为什么以下返回 true。

        console.log(Ctor instanceof Object); // true
        

        因此,如果您使用 new Object 来创建您的 Ctor 函数的对象,它只不过是一个对象,并且与执行此操作几乎相同

        var CtorCopy = {};
        CtorCopy = Ctor;
        

        它最终会有一个原型属性和一个指向你的Ctor对象的构造函数。 我希望这将使我们更清楚地了解内置对象的含义。既然您提到您不确定在这种情况下构建对象意味着什么。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-05-31
          • 2018-06-20
          • 2011-08-12
          • 1970-01-01
          • 2019-12-06
          • 2013-04-11
          • 2011-12-30
          • 2011-11-25
          相关资源
          最近更新 更多