2015-10-05 35 views
1

的instanceof打破我碰到一些奇怪的行爲來,而在JavaScript設置__proto__爲空,然後再設置它在Javascript

function Class() {}; 
var a = {}; 

a.__proto__ = Class.prototype 
a instanceof Class => true 

亂搞設置原爲空,然後重新分配給它的值相同品牌instanceof運算符返回false而不是true。

a.__proto__ = null 
a.__proto__ = Class.prototype 
a instanceof Class => false 
+0

你指出你認爲是一個錯誤,或者你有一個實際的問題?你想做什麼? – naomik

回答

3

我指揮你注意:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/proto

警告:更改[[原型]]的目的是,通過現代如何JavaScript引擎的性質Optimize屬性訪問,非常在每個瀏覽器和JavaScript引擎中運行緩慢。對改變繼承的性能的影響是微妙的和遙遠的,並不僅限於在obj中花費的時間。 proto = ...語句,但可以擴展到任何訪問其[[Prototype]]已被更改的任何對象的代碼。如果你關心性能,你應該避免設置一個對象的[[Prototype]]。相反,使用Object.create()使用所需的[[Prototype]]創建一個新對象。

而且

警告:雖然Object.prototype中。 proto目前在大多數瀏覽器中都受支持,它的存在和確切行爲僅在ECMAScript 6規範中作爲傳統功能標準化,以確保兼容性,適用於Web瀏覽器。爲了獲得更好的支持,建議只使用Object.getPrototypeOf()。

總之,你打破了事情,然後問他們爲什麼壞了。 __proto__並不意味着被改變,也沒有標準化的行爲,所以你不能依靠它做你想做的事情。

你想做什麼?你最終的目標是什麼?

+0

感謝您的回覆。我對JavaScript很陌生,並且正在瞭解新的運營商。我想我在這裏想要做的是弄清楚什麼是特定的東西的一個實例。 – aytee17

+1

然後我會建議查看[instanceof]的文檔(https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/instanceof)。 – naomik

0

[![2個PROTOS] [1] [1]

雖然我不知道你爲什麼會做任何這,檢查表明,對象有兩個性能。考慮到房產名稱應該是唯一的,這也是一個奇怪的現象。如果你想要一些半解釋(非解釋),這兩個原型屬性混亂與instanceOf

相關問題