我试图理解原型,并处理一些干扰,因为我对各种其他结构的理解。
有人能解释一下Javascript中的对象是什么吗?为了澄清,我知道什么是对象(小写'o'),但不知道什么对象(大写'O')是什么。我知道在JS中创建的任何对象都有一个隐藏的原型对象。prototype对象既是父对象的属性,也是对象本身,它自己的属性可以使用以下命令objectName.prototype;访问,另外,prototype对象的属性中包括一个prototype对象。对象与原型对象相同吗?如果不是,什么是对象--全局对象?它/它们与窗口对象或全局对象的关系如何?
提前谢谢你的帮助。我在网上搜索过这个问题的答案,却找不到一个既容易理解又能理解的答案。虽然我不是一个10岁的孩子,但如果你能像我一样向我解释一下,我不会生气,也会非常感激你的努力。
发布于 2018-11-07 23:22:16
我知道在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]]属性的值。
但是,这与两个对象之间的所有其他关系并没有太大的不同(所以没有什么特别的)。在下面的示例中,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属性的值成为通过new C创建的C新实例的原型。
Object.prototype实际上是Object中有趣的部分,也是最重要的部分。你可能听说过“原型链”。因为原型只是一个对象,它本身就是一个原型,一个对象,等等。这条链必须在某个地方结束。Object.prototype是位于基本上每条原型链末尾的值。
有许多原型链,因为每个不是原语值(布尔值、数字、字符串、空、未定义、符号)的值都是一个对象(包括函数、正则表达式、数组、日期等)。
如果不是,什么是对象--全局对象?
请参见上面的。它不是全局对象,浏览器中的全局对象是window,虽然每个JavaScript环境都必须有一个全局对象,但至少到目前为止,语言中还没有标准的方法来引用它(编辑:我猜全局环境中的this会采用一种跨平台的方式)。
它/它们与窗口对象或全局对象的关系如何?
唯一的关系是:
您可能认为全局对象的原型也是Object.prototype,但情况并不一定如此。
阅读材料:
https://stackoverflow.com/questions/53199341
复制相似问题