prototype.constructor和内置Object()之间有什么区别

What is the difference between prototype.constructor and built-in Object()

本文关键字:之间 什么 区别 constructor 内置 Object prototype      更新时间:2023-09-26

原型是一个对象,您创建的每个函数都会自动获得一个指向新空白对象的原型属性。此对象与使用对象文字或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((是什么意思(,而是指向我创建的函数。这令人困惑。

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

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

通过将值传递给Object,您调用了一种不同的行为,从而导致它创建该类型的对象。根据MDN:

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

因此,本质上,您已经设法用与我上面的示例相同的方式使用更多的代码来做同样的事情。请参阅此处-MDN。

根据MDN(强调矿(:

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

这意味着,如果您将Ctor函数(它是一个对象(传递给Object构造函数,它只会将原始函数返回给您。你看到的是两个完全相同的物体。

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

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

但是它的构造函数属性将指向你的函数,。。。

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

其中,如下所示将指向内置的Object函数。

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

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

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

它将为您提供内建对象。

这将解释为什么以下结果为真。

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

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

var CtorCopy = {};
CtorCopy = Ctor;

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