【问题标题】:Difference between proto link and Object.createproto 链接和 Object.create 的区别
【发布时间】:2013-03-11 13:14:30
【问题描述】:

我想知道__proto__Object.create 方法的区别。举个例子:

var ob1 = {a:1};
var ob2 = Object.create(ob1);

ob2.__proto__ === ob1; // TRUE

这意味着 Object.create 方法创建一个新对象并将__proto__ 链接设置为作为参数接收的对象。 我们为什么不直接使用__proto__链接而不是使用create方法呢?

【问题讨论】:

  • 1. __proto__ 是非标准的。 2)。 Object.create 可以接受第二个有用的参数。
  • 另一个值得注意的区别是__proto__ 允许您将现有对象的原型设置为不同的原型,而对于标准 Javascript(即使在 ECMAScript 5 中),它只能 获取原型(使用Object.getPrototypeOf),而不是设置它。
  • 我们可以传递什么作为第二个参数?
  • @blunderboy:您可以在 MDN 文档中了解它:developer.mozilla.org/en-US/docs/JavaScript/Reference/…
  • 这个库包含一个很好的 shim,可以让 Object.create 的第二个参数为旧版浏览器优雅地回退:github.com/cujojs/poly

标签: javascript object prototype


【解决方案1】:

__proto__ 是非标准的,并非所有地方都支持。 Object.create 是官方规范的一部分,应该得到未来每个环境的支持。

在不同的地方也有不同的实现方式。

来自Effective Javascript

环境不同,例如,在处理具有 空原型。在某些环境中,__proto__ 继承自 Object.prototype,所以原型为空的对象没有什么特别之处 __proto__属性

推进公认的创建对象和实现继承的方式是Object.create 函数,如果您确实需要访问原型,您将希望使用Object.getPrototypeOf 这些函数是标准化的,应该在所有现代环境

【讨论】:

【解决方案2】:

我们为什么不直接使用proto链接而不是使用create方法?

因为__proto__ 是一个非标准属性,因此不一定在所有浏览器中都可用。

但它似乎被考虑用于ES.next。更多信息:MDN - __proto__

【讨论】:

  • __proto__ 现在是标准的一部分:ecma-international.org/ecma-262/6.0/…
  • @John:是的,也不是。它在附件 B 中,上面写着 “本附件描述了基于 Web 浏览器的 ECMAScript 实现的各种遗留特性和其他特性。本附件中指定的所有语言特性和行为都具有一个或多个不受欢迎的特性,并且在没有遗留的情况下”“这些特性不被视为核心 ECMAScript 语言的一部分。程序员在编写新的 ECMAScript 代码时不应使用或假设存在这些特性和行为。”
  • 但在此之前它说:当 ECMAScript 宿主是 Web 浏览器时,本附件中定义的 ECMAScript 语言语法和语义是必需的
  • 那么我想我们可以说它很可能在浏览器中工作,但不一定在其他环境中。还是应该避免的。
  • 要求人们不要使用它对于委员会来说真的是一厢情愿的想法,因为现实情况是它是可用的并且不会去任何地方(与with 和其他几个功能不同)。 __proto__ 在 Object.create 可用时并不是特别有用,但如果它解决了您遇到的问题,则没有任何其他理由避免使用它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-05-08
  • 1970-01-01
  • 2012-04-01
  • 2016-08-20
  • 2020-10-04
  • 2011-05-08
  • 1970-01-01
相关资源
最近更新 更多