Object.keys
方法讓我們可以輕鬆地取得一個物件中的所有的屬性,但這個功能在IE8不支援所以無法使用,使用時會出現undefine的錯誤(IE9以上才支援)。
解決辦法是自己新增一個Object.keys
方法如下。
if (!Object.keys) {
Object.keys = function(obj) {
var keys = [];
for (var i in obj) {
if (obj.hasOwnProperty(i)) {
keys.push(i);
}
}
return keys;
};
}
或是使用完整的補完程式碼(polyfill)如下
if (!Object.keys) {
Object.keys = (function() {
'use strict';
var hasOwnProperty = Object.prototype.hasOwnProperty,
hasDontEnumBug = !({ toString: null }).propertyIsEnumerable('toString'),
dontEnums = [
'toString',
'toLocaleString',
'valueOf',
'hasOwnProperty',
'isPrototypeOf',
'propertyIsEnumerable',
'constructor'
],
dontEnumsLength = dontEnums.length;
return function(obj) {
if (typeof obj !== 'function' && (typeof obj !== 'object' || obj === null)) {
throw new TypeError('Object.keys called on non-object');
}
var result = [], prop, i;
for (prop in obj) {
if (hasOwnProperty.call(obj, prop)) {
result.push(prop);
}
}
if (hasDontEnumBug) {
for (i = 0; i < dontEnumsLength; i++) {
if (hasOwnProperty.call(obj, dontEnums[i])) {
result.push(dontEnums[i]);
}
}
}
return result;
};
}());
}
上面的程式碼要放在你原本使用Object.keys
的程式碼之前,最好放在JavaScript的程式碼的開頭,如此才會先被載入。
IE有夠爛,更爛的是不知長進的客戶。
參考:
沒有留言:
張貼留言