2013-03-11 64 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