检测原生原型与扩展原型

时间:2018-01-21 15:08:45

标签: javascript

在某些第三方库中,扩展了数组原型:

Array.prototype.repeat = function(value, length) {
    while (length) this[--length] = value;
    return this;
};

代码:

var model = {
  features:[1,2,3]
};


for (var p in model.features) {
  console.log(p);
}

期望值:

1
2
3

结果:

1
2
3
repeat

我的代码如何正确地确定超出普通原型的属性并跳过它们?

3 个答案:

答案 0 :(得分:0)

根据Question中的代码,您可以使用forfor..of循环来迭代数组

答案 1 :(得分:0)

有许多方法可以在JavaScript中迭代数组。选择一个时,您可能需要考虑以下

  • 浏览器支持(请注意,如果您使用像Babel这样的转发器,那么您可以自由选择)
  • 效率(尽管许多现代浏览器针对Array.prototype上的方法进行了优化,但它们仍然比循环标准慢。)
  • 可读性(应该清楚代码的部分内容是什么,某些情况下某些模式比其他模式更合适)
  • 不变性(已经观察到应该避免状态的隐式更改,因此使用保证迭代数组不变性的迭代器是一个好习惯。)

根据我自己的观察,我可以看出Array.prototype.map()是开发人员使用转换器和函数式编程范例的首选方法。

For Loops

for..in

虽然不推荐使用for..in来迭代数组,但您可以使用Object.prototype.hasOwnProperty()执行此操作,如下面的代码段所示。

for (const p in model.features) {
  if (model.features.hasOwnProperty(p)) {
    console.log(model.features[p]);
  }
}

结果

1
2
3

for..of

但是,您可以使用for...of代替处理数组时建议使用的内容。

for (const feature of model.features) {
  console.log(feature);
}

for

如果您不使用转换器并希望确保您的代码可以在任何浏览器上运行,那么这是您最好的选择。

for(var i = 0; i < model.features.length; i++) {
  console.log(model.features[i]);
}

Array.prototype

Array.prototype还有一些值得注意的内置方法。

Array.prototype.forEach()

arr.forEach((value, index, array) => {

});

Array.prototype.map()

arr.map((value, index, array) => {

});

答案 2 :(得分:0)

您需要检查.hasOwnProperty 请参阅此处的工作代码 - &gt; https://jsfiddle.net/xbdd6q13/2/

或者您也可以使用for..of代替for..in

for (var p of model.features) {
                console.log(p);    
}