首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Javascript: prototype x defineProperty x还有什么

Javascript: prototype x defineProperty x还有什么
EN

Stack Overflow用户
提问于 2013-10-08 09:39:47
回答 3查看 185关注 0票数 2

对于像Array这样的JS核心对象,我有一些小但有用的额外方法:

Array.prototype.indexOfObject(属性,值)

此方法返回数组(对象的)中对象的索引,其中为property==value,对我来说简单而高效。

然而,当我枚举任何数组时,这个方法就会出现,所以每次我都要这样做:

代码语言:javascript
复制
for(var i in MyArray){
  if(typeof(MyArray[i])=="typeneeded"){
    // do something
  }
}

据我所知,defineProperty创建了一个不可枚举的方法,这样当所有浏览器都接受它时,它就会解决我的问题。顺便问一下,使用defineProperty已经安全了吗?IE9运行得很好?其他浏览器?有没有第三种方法可以做到这一点?

EN

回答 3

Stack Overflow用户

发布于 2013-10-08 10:02:31

有一些ECMAScript兼容性矩阵:kangax's只适用于ES5,Thomas Lahn's将告诉你在各种ECMAScript实现的哪些版本中支持哪些功能。

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

代码语言:javascript
复制
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:

代码语言:javascript
复制
if (obj.propertyIsEnumerable(p)) {

这是用来适应早期Safari中的一个bug,但这个版本不应该再使用了。

顺便说一句,在:

代码语言:javascript
复制
> typeof(MyArray[i])

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

票数 3
EN

Stack Overflow用户

发布于 2013-10-08 14:13:33

你可以在所有浏览器上安全地使用hasOwnproperty,但你的问题是关于Object.defineProperty的。如果你不担心旧的浏览器(IE8),那么你可以使用这个:

代码语言:javascript
复制
//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
票数 1
EN

Stack Overflow用户

发布于 2013-10-17 01:54:44

只需使用传统的for循环,或forEach:

代码语言:javascript
复制
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));

FIDDLE

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19237682

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档