JavaScript中的对象与原型

时间:2018-11-07 23:15:34

标签: javascript prototype global

我试图理解原型并通过对其他各种构造的理解来处理一些干扰。

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

在此先感谢您的帮助。我已经在互联网上搜寻了有关此问题的答案,但找不到一个既可以访问又可以理解的解决方案。尽管我还不到10岁,但如果您能像我一样向我解释一下,我不会感到冒犯,并且将不胜感激。

1 个答案:

答案 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

在此示例中,foobar的原型。

  

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.prototypebut that is not necessarily the case


阅读材料: