Javascript中的对象与原型

efw*_*efw 3 javascript prototype global

我试图了解原型并处理我对各种其他结构的理解的一些干扰.

有人可以向我解释一下Javascript中的Object是什么吗?为了澄清,我知道一个对象(带有小写的"o")是什么,但不知道对象(带有大写"O")是什么.我知道在JS中创建的任何对象都附加了一个隐藏的原型对象.原型对象既是父对象的属性,又是对象本身,具有自己的属性,可以使用以下命令objectName进行访问.原型 ; 另外,原型对象的属性中有一个原型对象.Object与原型对象相同吗?如果没有,什么是对象 - 全局对象?它/它们如何与窗口对象或全局对象相关?

在此先感谢您的帮助.我已经在互联网上搜索了一个答案,并找不到一个既可访问也可理解的答案.虽然我不是10岁,如果你愿意向我解释,就像我一样,我不会被冒犯,并且会非常感激这种努力.

Fel*_*ing 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
Run Code Online (Sandbox Code Playgroud)

在这个例子中,foo是原型bar.

原型对象既是父对象的属性,也是对象本身

首先,不仅有一个原型对象.任何对象都可以充当原型,并且有许多不同的原型对象.当我们说"原型对象"时,我们实际上指的是具有原型"角色"的对象,而不是特定"类型"的对象.作为原型的对象与不是原型的对象之间没有可观察到的差异.

我不太确定你的"父对象的属性"是什么意思.对象是非属性,最多可以是属性的值.从这个意义上讲,是的,作为原型的对象必须是[[Prototype]]另一个对象的内部属性的值.

但这与两个对象之间的所有其他关系没有太大的不同(所以没什么特别的).在以下示例中bar是一个对象,并且还分配给以下属性foo:

var bar = {};
var foo = {bar: bar};
Run Code Online (Sandbox Code Playgroud)

Object与原型对象相同吗?

没有.

Object是(构造函数)用于创建对象的函数.var obj = new Object();是一样的var obj = {};.但是,使用对象文字({...})更方便,这就是为什么你没有看到new Object那么多使用.

对于每个构造函数C,以下都适用:

Object.getPrototypeOf(new C()) === C.prototype
Run Code Online (Sandbox Code Playgroud)

C.prototype属性的值成为C创建的via 的新实例的原型new C.

Object.prototype实际上是有趣的部分,Object也是最重要的部分.您可能听说过"原型链".因为原型只是一个对象,它本身就是一个原型,它是一个对象,等等.这个链必须在某个地方结束.Object.prototype是基本上每个原型链的末端的价值.
有许多原型链,因为每个不是原始值的值(布尔值,数字,字符串,空值,未定义,符号)都是一个对象(包括函数,正则表达式,数组,日期等).

如果没有,什么是对象 - 全局对象?

往上看.它不是全局对象,浏览器中的全局对象window,虽然每个JavaScript环境都必须有一个全局对象,但至少到目前为止还没有标准的语言方式来引用它(编辑:我猜this在全局环境中会有一个跨平台方式).

它/它们如何与窗口对象或全局对象相关?

唯一的关系是:

您可能认为全局对象的原型也是Object.prototype,但情况不一定如此


阅读材料: