Javascript:原型(prototype) x 定义属性 x 还有什么

标签 javascript prototype defineproperty

对于 JS 核心对象(例如数组),我有一些小但有用的额外方法:

Array.prototype.indexOfObject(属性,值)

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

但是,当我枚举任何数组时,该方法就会显示出来,所以每次我都必须这样做:

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

据我所知,defineProperty 提供了一个不可枚举的方法,因此当所有浏览器都接受它时它将解决我的问题。顺便问一下,使用defineProperty已经安全了吗? IE9好用吗?其它浏览器?还有第三种方法吗?

最佳答案

有一些 ECMAScript 兼容性矩阵:kangax's仅适用于 ES5,Thomas Lahn's将告诉您各种 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 不一定以任何特定顺序返回属性,并且可以显示在不同浏览器中以不同顺序返回它们。因此,仅将其与访问成员的顺序不重要的数组一起使用。

PS。您也可以使用propertyIsEnumerable,因为它只为对象本身的属性返回true:

if (obj.propertyIsEnumerable(p)) {

这用于解决早期 Safari 中的错误,但该版本不应再使用。

顺便说一句,在:

> typeof(MyArray[i])

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

关于Javascript:原型(prototype) x 定义属性 x 还有什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19237682/

相关文章:

javascript - 扩展 JavaScript?

javascript - 我可以在不使用 new 关键字的情况下构造 JavaScript 对象吗?

javascript - 对定义的属性使用 Object.defineProperty

javascript - 如何查找属性的 set/get 函数 (Object.defineProperty)

javascript - 如何在 JSON 模型中将聚合列表绑定(bind)到对象而不是数组?

javascript - Angular 2.0 和 TypeScript - 从多维数组对象填充 <select> 选项

javascript - 为什么 JavaScript 对象的这个扩展不起作用?

javascript - Object.defineProperties() 中的自引用

javascript - 检测 iPhone 5 及其以下的任何 iOS 设备

javascript - 关闭 <ul> 每 8 <li>