[英]Javascript: prototype x defineProperty x what else
對於Array之類的JS核心對象,我有一些小而有用的額外方法:
Array.prototype.indexOfObject(屬性,值)
此方法返回(對象)數組中對象的索引,其中property == value,對我而言簡單而高效。
但是,當我枚舉任何Array時,該方法將顯示出來,所以每次我都要做這樣的事情:
for(var i in MyArray){
if(typeof(MyArray[i])=="typeneeded"){
// do something
}
}
據我所知,defineProperty制作了一個不可枚舉的方法,因此當所有瀏覽器都接受它時,它將解決我的問題。 順便說一句,使用defineProperty已經安全嗎? IE9運作良好嗎? 其它瀏覽器? 有第三種方法可以做到嗎?
周圍有一些ECMAScript兼容性矩陣: kangax僅適用於ES5, Thomas Lahn會告訴您各種ECMAScript實現的哪些版本支持哪些功能。
“第三種方式”是使用hasOwnProperty測試,該測試可在所有瀏覽器中使用,並且在您無法完全控制的任何環境中都是一個好主意:
for (var p in obj) {
if (obj.hasOwnProperty(p)) {
// p is an own property of obj
// do stuff with obj[p]
}
}
您還可以使用Object.keys ,它也只返回自己的屬性,但是支持可能少於defineProperty 。
您還應該注意, for..in不一定以任何特定順序返回屬性,並且可以顯示為在不同的瀏覽器中以不同順序返回屬性。 因此,僅在訪問成員順序不重要的Array中使用它。
PS。 您也可以使用propertyIsEnumerable ,因為它僅對對象本身的屬性返回true:
if (obj.propertyIsEnumerable(p)) {
它用於解決早期Safari中的錯誤,但該版本不再可用。
順便說一句,在:
> typeof(MyArray[i])
不需要括號, typeof是運算符。 另外,檢查屬性的類型不會告訴您它是否是對象的自己的屬性,甚至不存在(盡管在這種情況下,它是因為它來自for..in )。
您可以對所有瀏覽器安全地使用hasOwnproperty,但是您的問題是關於Object.defineProperty的 。 如果您不擔心舊的瀏覽器(IE8),則可以使用以下方法:
//you should reload when you want to change value
//or you'll get a can't redefine error
Object.defineProperty(Array.prototype,"someFn",{
enumerable: false,
configurable: false,
writable: false,
value: function(){console.log("my fn");}
});
var a = [1,2,3,4];
for(thing in a){
console.log(thing);//=0,1,2,3
}
a.someFn();//=my fn
只需使用傳統的for循環或forEach:
var i,
ary = ['val0', 'val1', 'val2'];
Array.prototype.getElem = function (i) {
return this[i];
};
console.log('First way - using standard for loop:');
for (i = 0; i < ary.length; i++) {
console.log('Element ' + i + ' has value ' + ary[i]);
}
console.log('second way - use "first order function" - "functional programming" style');
ary.forEach(function (e, i) {
console.log('Element ' + i + ' has value ' + ary[i]);
});
console.log('getElem says: element 2 has value ' + ary.getElem(2));
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.