原型是一个对象,您创建的每个函数都会自动获取一个指向新空白对象的prototype属性。此对象与使用对象文字或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()是什么意思)但是我创造的功能。
这很令人困惑。
答案 0 :(得分:2)
您在问题开头引用的文字指的是通过您定义的构造函数创建对象与使用以下内容之间的区别:
var obj = new Object();
// or
var obj = {};
通过向Object传递一个值,您将调用一个不同的行为,从而导致它创建该Type的对象。根据MDN:
Object构造函数为给定值创建一个对象包装器。如果值为null或未定义,则它将创建并返回一个空对象,否则,它将返回与给定值对应的Type对象。如果该值已经是一个对象,它将返回该值。
所以基本上你已经设法用更多的代码做同样的事情,就像我上面的例子一样。 See here - MDN
答案 1 :(得分:1)
根据MDN(强调我的):
Object构造函数为给定值创建一个对象包装器。如果值为null或未定义,则它将创建并返回一个空对象,否则,它将返回与给定值对应的Type对象。 如果该值已经是某个对象,则会返回该值。
这意味着如果您将Ctor
函数(对象)传递给Object
构造函数,它只会将原始函数返回给您。您正在查看两个相同的对象。
答案 2 :(得分:0)
你问题中的上述引言只是说每当你创建一个函数时,它会附加一个指向一个对象的prototype属性,它的本质与创建的对象几乎相同。使用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 {}
将为您提供构建对象。
这将解释为什么以下内容返回true。
console.log(Ctor instanceof Object); // true
因此,如果您使用 new Object 来创建Ctor函数的对象,这只是一个对象,而且几乎与此相同
var CtorCopy = {};
CtorCopy = Ctor;
它最终会有一个原型属性,其构造函数指向您的Ctor对象。 我希望这将使得对象的构建意味着更清楚一点。既然你已经提到你不确定在这种情况下对象的构建意味着什么。