我试图理解原型并通过对其他各种构造的理解来处理一些干扰。
有人可以向我解释Javascript中的对象是什么吗?为了澄清,我知道什么是对象(带有小写字母“ o”),但不是什么对象(带有大写字母“ O”)。我了解到,在JS中创建的任何对象都附加了一个隐藏的原型对象。原型对象既是父对象的属性,又是对象本身,具有其自身的属性,可以使用以下命令objectName进行访问。 prototype ;另外,原型对象的属性中包括原型对象。对象与原型对象相同吗?如果不是,什么是Object -全局对象?它/它们与窗口对象或全局对象有什么关系?
在此先感谢您的帮助。我已经在互联网上搜寻了有关此问题的答案,但找不到一个既可以访问又可以理解的解决方案。尽管我还不到10岁,但如果您能像我一样向我解释一下,我不会感到冒犯,并且将不胜感激。
答案 0 :(得分:6)
我知道,在JS中创建的任何对象都有一个隐藏的原型对象。
基本上是。每个对象都有一个内部属性,在规范中用[[Prototype]]
表示,其值只是另一个对象的(引用)。 另一个对象是第一个对象的原型。
虽然原型对象本身并未隐藏,但是您可以通过Object.create
显式设置对象的原型:
var foo = {x: 42};
var bar = Object.create(foo);
console.log(bar.x); // 42
console.log(Object.getPrototypeOf(bar) === foo); // true
在此示例中,foo
是bar
的原型。
prototype对象既是父对象的属性,又是对象本身
首先,不仅只有一个原型对象。任何对象都可以充当原型,并且有许多不同的原型对象。当我们说“原型对象”时,实际上是指具有原型的“角色” 的对象,而不是特定“ type” 的对象。 。原型对象与非原型对象之间没有明显的区别。
我不太确定您在这里所说的“父对象的属性”是什么意思。对象不是属性,最多只能是属性的值。从这个意义上讲,是的,作为原型的对象必须是另一个对象的内部[[Prototype]]
属性的值。
但是,这与两个对象之间的其他关系没有太大区别(因此没什么特别的)。在下面的示例中,bar
是一个对象,并且还分配给属性foo
:
var bar = {};
var foo = {bar: bar};
对象与原型对象相同吗?
否。
Object
是用于创建对象的(构造函数)功能。 var obj = new Object();
与var obj = {};
相同。但是,使用对象文字({...}
)更为方便,这就是为什么您没有看到new Object
用得太多的原因。
对于每个构造函数C
,以下条件成立:
Object.getPrototypeOf(new C()) === C.prototype
即C.prototype
属性的值成为通过C
创建的new C
新实例的原型。
Object.prototype
实际上是Object
中最有趣的部分,也是最重要的部分。您可能已经听说过“原型链” 。因为原型只是一个对象,所以它本身就有一个原型,也就是一个对象,等等。该链必须在某处结束。 Object.prototype
是基本上位于每个原型链末尾的值。
原型链之所以很多,是因为每个不是原始值(布尔值,数字,字符串,空值,未定义,符号)的值都是对象(包括函数,正则表达式,数组,日期等)。
如果不是,什么是对象-全局对象?
参见上文。它不是全局对象,浏览器中的全局对象是window
,尽管每个JavaScript环境都必须具有全局对象,但至少到目前为止,尚无标准的语言引用方式( edit: 我猜想this
在全球环境中会是一种跨平台的方式。
它与窗口对象或全局对象有什么关系?
唯一的关系确实是:
您可能会认为全局对象的原型也是Object.prototype
,but that is not necessarily the case
阅读材料: