首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JavaScript中原型链的末尾是什么-- null还是Object.prototype?

JavaScript中原型链的末尾是什么-- null还是Object.prototype?
EN

Stack Overflow用户
提问于 2016-04-18 11:39:13
回答 4查看 2.4K关注 0票数 10

我一直在阅读JavaScript中的原型链,并得出了两个稍微不同的定义。据说,JavaScript中的每个对象都有一个原型,而那个原型又有另一个原型。

顶部原型(Grand)也可能有原型,并且链可以继续。现在链子会停在最后一个物体上。https://en.wikipedia.org/wiki/Douglas_Crockford#Bibliography说,链在Object.prototype终止,MDN说 null是链终止的最后一个环节。

Javascript:每个对象的好部分都链接到一个原型对象,它可以从中继承属性。从对象文本创建的所有对象都链接到Object.prototype,,是JavaScript标准的对象。

每个对象都有到另一个称为原型的对象的内部链接。这个原型对象有自己的原型,依此类推,直到达到一个以null作为原型的对象。根据定义,null没有原型,并充当此原型链中的最后一个链接。

  • JavaScript中原型链的末尾是什么-- null还是Object.prototype?还是nullObject.prototype是同一回事?
  • 不是从对象文本创建的对象,也不是链接到Object.prototype的对象。
  • 假设我有一个对象var x = { len: 4, breadth: 5}。JavaScript会自动创建它的原型x.prototype吗?原型链会有多长?x.prototype只会有一个原型,Object.prototype,制造三点链吗?
  • JavaScript如何在内部创建自动原型?
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2016-04-18 11:51:50

  1. 就像,如果纽约有一个信封,里面写着科罗拉多,科罗拉多州有一个信封,里面写着旧金山,旧金山有一个信封,里面写着“没有”。那么,旧金山是连锁经营的尽头,还是“没有”是连锁的终结?这可能取决于你如何看待它。但有一件事是肯定的:为了继承目的(原型继承),它指向链上和上面,直到到达null,这意味着不能再往上走了。确保你知道,要上上下下,这是__proto__。这不是prototype
  2. Object.prototypeAnimal.prototypex.__proto__不同。前者是函数对象(对象、动物),具有指向原型对象的prototype属性。x.__proto__是原型链向上跟踪的方式。向上和向上,它是x.__proto__.__proto__等等。请参阅JavaScript伪经典继承图以更多地理解它。
  3. Object.prototype指的是原型对象。引自MDNnull“表示有意缺少任何对象值,它是JavaScript的原始值之一。所以Object.prototypenull不是一回事。
  4. 所有JavaScript对象都将有obj.__proto__最终引用Object.prototype引用的内容。如果它不是obj.__proto__,那么它就是obj.__proto__.__proto__。如果没有,只要向上,然后向上,它将到达Object.prototype引用的prototype对象。此时,当您上升一个级别时(通过添加一个.__proto__,则得到null。您可以在Google的开发者工具中试用: X= {a: 1} > Object {a:1} x.__proto__ === Object.prototype > true x.__proto__.__proto__ > null Object.prototype.__proto__ > null
票数 9
EN

Stack Overflow用户

发布于 2016-04-18 11:49:13

JavaScript中原型链的末端是什么?

零。语言上只有权限是https://tc39.es/ecma262/#sec-properties-of-the-object-prototype-object

不是从对象文本创建的对象,是否没有链接到Object.prototype

他们可能或者很多人不是,例如。

代码语言:javascript
复制
var x = Object.create(null)

[[Prototype]]为null,而:

代码语言:javascript
复制
var y = {};

拥有[[Prototype]] of Object.prototype。

假设我有一个对象var x = { len: 4, breadth: 5}。JavaScript会自动创建它的原型x.prototype吗?

不是的。函数对象具有默认的原型对象。普通对象有一个默认的[[Prototype]] (即内部原型属性),即Object.prototype (除非按照上面的构造)。

原型链会有多长?x.prototype只会有一个原型,Object.prototype,制造三点链吗?

两个值: Object.prototype和null。

JavaScript如何在内部创建自动原型?

不管它喜欢什么,语言规范并不定义实现,只定义行为。

票数 4
EN

Stack Overflow用户

发布于 2017-03-18 22:43:06

javascript中原型链的末尾是什么-- null还是Object.prototype?还是null和Object.prototype是同一回事?

null。在普通的JavaScript环境中,考虑以下代码:

代码语言:javascript
复制
var o = {};
console.log(o.i_am_a_property_that_does_not_exist);

属性访问器操作(o.i_am_a_property_that_does_not_exist)最终将转到规范定义的OrdinaryGet抽象操作,其中O设置为上面的o对象,P设置为"i_am_a_property_that_does_not_exist"。这个手术是这样开始的:

  1. 断言: IsPropertyKey(P)为真。
  2. 让德斯克去吧?O.GetOwnProperty。
  3. 如果desc是未定义的,则

让父母来吧?O.GetPrototypeOf。

如果父级为null,则返回未定义的

c.返回?父母,[得到]

  1. ..。

对于上面的例子,[Get]操作在3.c中。最后递归地调用OrdinaryGet,直到我们的原型用完为止。正如我们所看到的,当我们到达null时,链就结束了。

此外,有一个不包含Object.prototype的原型链的对象是完全可能的(稍后我们会看到一些)。所以很明显,Object.prototype不可能是原型链的末尾。

不是从对象文本创建的对象,是否没有链接到Object.prototype

绝大多数将直接或间接地与Object.prototype联系在一起。考虑:

代码语言:javascript
复制
function Thing() {
}
var t = new Thing();

t的原型是Thing.prototype引用的对象,Thing.prototype的原型是Object.prototype,因此tObject.prototype (间接)相连。

但是,对象完全有可能不链接到Object.prototype。有一种方法:

代码语言:javascript
复制
var o = Object.create(null);

Object.create允许我们使用我们在第一个参数中指定的原型(上面的null)创建一个对象。所以上面的o没有原型,它的[ prototype ]内部插槽(对象记住它们的原型)是null

这是另一个:

代码语言:javascript
复制
function Thing() {
}
Thing.prototype = Object.create(null);
var t = new Thing();

在这种情况下,尽管t有一个原型,但它的原型是空的;t根本没有链接到Object.prototype

假设我有一个对象var x = { len: 4, breadth: 5}。JavaScript会自动创建它的原型x.prototype吗?

对象的原型不是一个名为prototype的属性,所以JavaScript引擎不会创建x.prototype。对象的原型通过其[ prototype ]内部插槽链接,这不是直接可观察的,而是可以通过Object.getPrototypeOf检索的。(也有属性,但最好不要使用它,尤其是因为A)它是规范的一个可选部分,B)并非所有对象都继承自Object.prototype,这是定义__proto__的地方。)

prototype属性仅用于函数,以确定使用哪个对象作为通过带有该函数的new创建的新对象的[原型]。非函数对象没有它,如果有,它就不会比一个名为foobazinga的属性更特殊。

原型链会有多长?x.prototype只会有一个原型Object.prototype做一个三点链吗?

您已经接近了,但是同样,prototype属性不是对象的原型,非函数对象通常不会有prototype属性。对于var x = { len: 4, breadth: 5},继承链是:

  • x
  • x's [原型]
  • Object.prototype的[原型],就是null

因此,非常短;1、2或3取决于您是否要计数x和是否要计数null

JavaScript如何在内部创建自动原型?

除了规范定义的那些(例如,Object.prototype等)之外,它没有。最接近的是,对于所有function函数,JavaScript引擎会自动创建一个对象,并将该对象分配给该函数的prototype属性,以防该函数被用作构造函数(通过new)。(它不使用箭头函数或生成器来实现这一点。)

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36692927

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档