簡體   English   中英

Javascript:原型x defineProperty x其他

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM