ES5引入Object.getPrototypeOf函數作為獲取對象原型的標準API,但由於之前的很多js引擎使用了一個特殊的__proto__屬性來達到相同的目的。但有些瀏覽器並不支持這個__proto__屬性,所以並不是完全相容的。例如對於擁有null原型的對象,不同的環境結果就不同了。 ...
ES5引入Object.getPrototypeOf函數作為獲取對象原型的標準API,但由於之前的很多js引擎使用了一個特殊的__proto__屬性來達到相同的目的。但有些瀏覽器並不支持這個__proto__屬性,所以並不是完全相容的。
例如對於擁有null原型的對象,不同的環境結果就不同了。
var empty=Object.create(null); '__proto__' in empty;//一些環境會返回false,另一些會返回true
這就導致結果的不一致,從而影響到依賴這個判斷的相關代碼。
無論在什麼情況下,Object.getPrototypeOf函數都是有效的,而且它是提取對象原型更加標準、可移植的方法。由於__ptoto__屬性會污染所有的對象,因此它會導致大量的bug。
對於一些沒有提供該ES5 api的js環境,可以很容易利用__proto__屬性來實現Object.getPrototypeOf函數。
if(typeof Object.getPrototypeOf === 'undefined'){ Object.getPrototypeOf=function(obj){ var t=typeof obj; if(!obj || (t !== 'object' && t !== 'function')){ throw new Error("不是一個對象!"); } return obj.__proto__; } }
上面代碼對宿主環境是否實現Object.getPrototypeOf函數進行判斷,在ES5標準的環境中也很安全。
提示
-
使用符合標準的Object.getPrototypeOf函數而不要使用非標準的__proto__屬性
-
在支持__proto__屬性的非ES5環境中實現Object.getPrototypeOf函數