prototype.constructor和内置Object()之间有什么区别
What is the difference between prototype.constructor and built-in Object()
原型是一个对象,您创建的每个函数都会自动获得一个指向新空白对象的原型属性。此对象与使用对象文字或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对象的构造函数。我希望这将使它更清楚地了解内建对象的含义。由于您已经提到,您不确定在这种情况下内建对象意味着什么。
- 全局变量和全局对象的属性之间有什么区别吗
- 什么是&&在没有if的行中的变量之间
- DOM元素和angular元素之间的主要区别是什么
- 什么's本地node.js服务器和python简单http服务器之间的区别
- JSDoc:模块和名称空间之间的关系是什么
- 什么'$.get和$.ajax之间的区别是什么
- Math.min()和Math.max()之间有什么区别?在Javascript中
- 什么'在Express中路由时,应用程序级中间件和路由器级中间件之间的区别是什么
- webpack开发模式和生产构建模式之间有什么区别
- 关于承诺/A+规范,术语“当时可”和“承诺”之间有什么区别
- 什么's extjs中的mon()和on()之间的区别
- XMLHttpRequest对象的open()和send()方法之间有什么区别
- 在使用JS的Ajax调用中,ajaxComplete和beforesend之间有什么区别
- 什么's使用链接和脚本标记引用JavaScript源之间的区别
- 什么's使用脚本标记调用文件和ajax之间的区别
- $(e.target).find和template.find('input').value之间有什么区别
- 什么'“dest”和“dist”之间的区别是什么
- 使用Javascript,获取元素的方法是什么,基于打开和关闭标记之间的文本
- 在测试间谍的上下文中,存根和mock之间有什么区别?(茉莉花)
- webpack中的源映射之间有什么区别