Javascript:prototype x defineProperty x还有什么

Javascript:prototype x defineProperty x还有什么,javascript,prototype,defineproperty,Javascript,Prototype,Defineproperty,我为JS核心对象(如Array)提供了一些小而有用的额外方法: Array.prototype.indexOfObject(属性,值) 这个方法返回数组中对象的索引,其中property==value,对我来说简单而高效 但是,当我枚举任何数组时,都会显示该方法,因此每次我都要这样做: for(var i in MyArray){ if(typeof(MyArray[i])=="typeneeded"){ // do something } } 正如我所知,defineProp

我为JS核心对象(如Array)提供了一些小而有用的额外方法:

Array.prototype.indexOfObject(属性,值)

这个方法返回数组中对象的索引,其中property==value,对我来说简单而高效

但是,当我枚举任何数组时,都会显示该方法,因此每次我都要这样做:

for(var i in MyArray){
  if(typeof(MyArray[i])=="typeneeded"){
    // do something
  }
}

正如我所知,defineProperty是一个不可枚举的方法,所以当所有浏览器都接受它时,它将解决我的问题。顺便问一下,它已经安全使用了吗?IE9工作正常吗?其他浏览器?有第三种方法吗?

有几个ECMAScript兼容性矩阵:仅适用于ES5,将告诉您在各种ECMAScript实现的版本中支持哪些功能

“第三种方法”是使用hasOwnProperty测试,该测试适用于所有浏览器,在您无法完全控制的任何环境中都是一个好主意:

for (var p in obj) {

  if (obj.hasOwnProperty(p)) {

    // p is an own property of obj
    // do stuff with obj[p]
  }
}
您也可以使用,它也只返回自己的属性,但支持可能比defineProperty少

您还应该注意,for..in不一定以任何特定顺序返回属性,并且可以在不同的浏览器中显示为以不同的顺序返回属性。因此,只能在访问成员的顺序不重要的数组中使用它

另外,您也可以使用propertyIsEnumerable,因为它仅对对象本身的属性返回true:

if (obj.propertyIsEnumerable(p)) {
这是用来适应早期Safari中的一个bug的,但是这个版本不应该再使用了

顺便说一句,在:

> typeof(MyArray[i])

不需要括号,typeof是一个运算符。此外,检查属性的属性并不能告诉您它是否是对象的自有属性,或者它是否存在(尽管在本例中,它是这样做的,因为它来自for..in)。

您可以在所有浏览器中安全地使用hasOwnproperty,但您的问题是。如果您不担心旧浏览器(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));
vari,
ary=['val0','val1','val2'];
Array.prototype.getElem=函数(i){
归还这个[我];
};
log('First-way-使用循环的标准:');
对于(i=0;i

Try,有关于这类事情的有用信息。你不应该在
中对…使用数组。使用带有递增索引的典型
for
循环或
forEach
如果可用,使用传统方法解决抛出无用if语句的问题。我想我喜欢……在,提醒我其他语言,但这就是生活……这将改进我的代码,但保留我希望打破的结构。@RobG:你的Thomas Lahn链接似乎broken@aeoril-链接正常,但服务器有点慢。@RobG是的,这次链接正常。在重读你的答案时,它是最好的:)如果问题只是IE8和以前的IE,也许我会通过定义属性来更改原型,这是一种“改进”的实现方法。我厌倦了IE8的担忧…@Phill提到了其他类型的for循环。forEach并不总是可用的,而传统的forEach是一种选择,是的。但是我打开这个线程是为了一个“以前的”解决方案,因为什么时候最好改变你上课的方式。但感谢您为我们编写解决方案的脚本。@GustavoPinent如果您想使您的新方法不可枚举,请使用defineProperty。但是,在枚举整数索引数组元素时,可能仍应使用传统的for或forEach。defineProperty也并非始终可用。