2013-03-11 63 views
5

之间的区别我想知道__proto__Object.create方法之间的区别。就拿这个例子:proto链接和Object.create

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

ob2.__proto__ === ob1; // TRUE 

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

+1

1.'__proto__'是非标准的。 2)。 'Object.create'可以接受可能有用的第二个参数。 – dfsq 2013-03-11 13:19:21

+1

另一个值得注意的差异是'__proto__'允许您将现有对象的原型设置为不同的原型,而使用标准的Javascript(即使在ECMAScript 5中),它只能*获取原型(使用Object .getPrototypeOf'),而不是*设置*它。 – 2013-03-11 13:20:59

+0

我们可以通过什么作为第二个参数? – sachinjain024 2013-03-11 13:21:53

回答

3

__proto__是非标准的,在任何地方都不会支持。 Object.create是官方规范的一部分,应该得到每个环境的支持。

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

Effective Javascript

环境差异,例如,在被处理物的与 空原型。在某些环境中,__proto__从 的Object.prototype继承,所以用空原型的对象没有特别的 __proto__财产

展望未来的接受的方式来创建对象和实现继承是Object.create功能,如果你需要访问原型,你会想要使用Object.getPrototypeOf这些功能是标准化的,应该在所有现代环境中工作相同

+0

“创造”这个术语要求混淆,我认为它是创建一个新对象并复制它的属性但现在我明白了。谢谢:) – sachinjain024 2013-03-11 13:20:45

+0

'Object.create'创建一个新的对象。第一个参数是新的原型,第二个参数允许你复制属性。在这里查看更多:https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Object/create – 2013-03-11 13:24:49

+0

'__proto__'现在是ES6标准的一部分: http://www.ecma- international.org/ecma-262/6.0/index.html#sec-object.prototype.__proto__ – John 2016-04-05 17:00:24

3

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

因为__proto__非标准财产,因此未必可以在每个浏览器。

但它似乎被认为是ES.next。更多信息:MDN - __proto__

+0

'__proto__'现在是的标准: http://www.ecma-international.org/ecma-262/6.0/index.html#sec-object.prototype.__proto__ – John 2016-04-05 17:01:08

+0

@John:是的,没有。它在附件B中,它说*“本附件描述了基于Web浏览器的ECMAScript实现的各种遗留功能和其他特性。本附录中指定的所有语言特性和行为都有一个或多个不合需要的特性,并且在没有传统使用的情况下从本规范中删除。“*和*”这些功能不被视为核心ECMAScript语言的一部分。在编写新的ECMAScript代码时,程序员不应该使用或假定这些功能和行为的存在。“* – 2016-04-05 17:02:45

+0

但在此之前它说: 当ECMAScript主机是Web浏览器时,本附录中定义的ECMAScript语言语法和语义是__required__。 – John 2016-04-05 17:09:17