Javascript 使用“时,是什么导致原型变量显示?”;对于“在”中;?

Javascript 使用“时,是什么导致原型变量显示?”;对于“在”中;?,javascript,Javascript,我了解你,所以尽管很烦人,但我总是保护自己不受它的伤害 但在使用“for in”时,到底是什么导致原型的扩展出现的呢?有时使用“for in”是安全的(或似乎是安全的),有时则不是 即。: 例如,我说的是: Array.prototype.last = function(){ return this[this.length-1]; } 显示为: for(var k in someArray){ console.log("%o %o", k, someArray[k]

我了解你,所以尽管很烦人,但我总是保护自己不受它的伤害

但在使用“for in”时,到底是什么导致原型的扩展出现的呢?有时使用“for in”是安全的(或似乎是安全的),有时则不是

即。: 例如,我说的是:

Array.prototype.last = function(){ return this[this.length-1]; }
显示为:

for(var k in someArray){
    console.log("%o %o", k, someArray[k]); // eventually outputs "last 'function(){ return this[this.length-1]; }'
}

这种行为是故意的


for in
循环所有可枚举属性,包括从原型继承的属性。

此行为是通过设计实现的


for in
在所有可枚举属性上循环,包括从原型继承的属性。

正如SLaks所说,这是经过设计的。决定属性(继承或不继承)是否显示在<代码>for..in循环中的是它的[[Enumerable]]内部属性。如果是真的,属性将显示,否则不会显示

每个属性都有这样一个属性(以及其他一些属性)。可以使用以下方法进行检查。例如,考虑您的
Array.prototype.last
方法:

var descriptor = Object.getOwnPropertyDescriptor(Array.prototype, "last");
它将返回如下所示的对象:

{
configurable: true,
enumerable: true,
value: function (){ return this[this.length-1]; },
writable: true
}
您可以使用更改[[Enumerable]]的值,以在循环中对..隐藏它:

descriptor.enumerable = false;
Object.defineProperty(Array.prototype, "last", descriptor);

正如SLaks所说,这是设计的。决定属性(继承或不继承)是否显示在<代码>for..in循环中的是它的[[Enumerable]]内部属性。如果是真的,属性将显示,否则不会显示

每个属性都有这样一个属性(以及其他一些属性)。可以使用以下方法进行检查。例如,考虑您的
Array.prototype.last
方法:

var descriptor = Object.getOwnPropertyDescriptor(Array.prototype, "last");
它将返回如下所示的对象:

{
configurable: true,
enumerable: true,
value: function (){ return this[this.length-1]; },
writable: true
}
您可以使用更改[[Enumerable]]的值,以在循环中对..隐藏它:

descriptor.enumerable = false;
Object.defineProperty(Array.prototype, "last", descriptor);

你有一个流浪的
,我不知道它应该去哪里…是什么原因造成的?什么都没有…它发生了,因为(“枚举对象的属性包括枚举其原型的属性…”)你说的“保护”是什么意思“你反对吗?你是说
hasOwnProperty
?如果是这样,那仍然是迭代数组的错误方法。在您自己的代码中扩展
数组没有问题。prototype
,只要循环正确。jQuery的
.forEach
不应该到达
数组上的项。prototype
,但在循环对象时,它将从
对象中获取可枚举项。prototype
。如果您在
对象上有可枚举属性。prototype
,您应该修复它。
for…in
永远不应该与
数组一起使用
,句点。您有一个零散的
在那里,我不确定它应该去哪里…是什么原因造成的?实际上没有什么事情发生,因为(”枚举对象的属性包括枚举其原型的属性…)你说的“保护”是什么意思“你反对吗?你是说
hasOwnProperty
?如果是这样,那仍然是迭代数组的错误方法。在您自己的代码中扩展
数组没有问题。prototype
,只要循环正确。jQuery的
.forEach
不应该到达
数组上的项。prototype
,但在循环对象时,它将从
对象中获取可枚举项。prototype
。如果您在
对象.prototype
上有可枚举属性,您应该修复它。
for…in
永远不应该与
数组一起使用
,句点。+1也许您应该提及如何使用
hasOwnProperty
来避免“继承”如果需要
for…in
循环,请使用属性。+1如果需要
for…in
循环,您可能应该提到如何使用
hasOwnProperty
来避免“继承”属性。