3

当我尝试包含 ember.js 库 (ember-1.0.0-rc.7.js) 时,我看到了一些奇怪的东西。

我刚刚打印出一个 javascript 数组的 javacode:

<script type="application/javascript">
var songs = [ 'a','b','c'];

console.debug(songs.toString());
for(key in songs)
{
    console.debug(songs[key]);
}

</script>

当我不包含库时,它会在控制台中打印出 a , b, c 。但是,当我确实包含它时,它会开始打印出 a、b、c 以及所有功能...

例子:

function (idx) {
    return this.objectAt(idx);
  }
function superWrapper() {
    var ret, sup = this._super;
    this._super = superFunc || K;
    ret = func.apply(this, arguments);
    this._super = sup;
    return ret;
  }
function (key) {
    return this.mapProperty(key);
  }

ember.js 库出现这种情况的任何原因,我该如何解决这个问题?

任何建议表示赞赏,谢谢,D

4

2 回答 2

2

embjer.js 必须向原生 Array.prototype 添加函数。您可以使用hasOwnProperty检查每个键是否实际上是数组本身的属性,而不是继承的属性:

for(key in songs) {
    if(songs.hasOwnProperty(key)){ 
        console.debug(songs[key]);
    }
}

但是,通常建议始终使用带有数组的普通 for 循环,因为它们有数字键:

for(var i = 0; i < songs.length; i++) {
    console.debug(songs[i]);
}

您还可以使用forEach 函数,具有讽刺意味的是,Ember 添加到 Array 原型中,如果它不存在(在旧浏览器中)。

songs.forEach(function(song){
    console.debug(song);
});

演示

于 2013-08-28T22:05:48.460 回答
2

默认情况下,Ember 扩展了内置原型,例如Array.prototype为不支持的浏览器提供额外的方法或 shim ES5 方法。您看到这些方法是因为for...in迭代对象的可枚举属性。这些包括所有属性,即使是通过原型链继承的属性。

相反,您应该使用常规for循环来迭代数组:

for(var i=0; i<songs.length; i++) {
    console.debug(songs[i]);
}

这只会遍历实际的数组元素,即带有数字键的属性。不过还有更好的方法,例如使用 ES5 Array.forEach(在旧浏览器中由 Ember 填充):

songs.forEach(function(song, i) {
    console.debug(song);
});

或者,您可以通过配置禁用 Ember 的原型扩展,Ember.EXTEND_PROPERTIES如果您不打算使用它们,或者它们是否可能与其他库/脚本冲突。在 Ember 文档中有一整页专门讨论这个问题。

于 2013-08-28T22:10:30.717 回答