Javascript原型扩展奇怪的行为

时间:2015-05-12 13:48:12

标签: javascript foreach split prototype

你能解释一下吗?

JAVASCRIPT

By byXpath = By.xpath("//*[starts-with(@id,'result_')]//div//div[1]//div//a//img");
List <WebElement> listofItems = wd.findElements(byXpath);
for (int i=1; i<=listofItems.size(); i++)
{
    //I would suggest you to see if you can improve the selector though
    By by= By.xpath("//*[starts-with(@id,'result_')]//div//div[1]//div//a//img[" + i + "]");
    WebElement myDynamicElement = (new wd(driver, 10))
    .until(ExpectedConditions.presenceOfElementLocated(by));
    System.out.println(i);
    myDynamicElement.click();
    wd.navigate().back();
}

输出

if (typeof Array.prototype.contains != 'function') {
    Array.prototype.contains = function (str){
        return this.indexOf(str) > -1;
    };
}

var text = "Hello world";
var tokens = text.split(" ");
console.log(tokens.length);
for (var i in tokens){
    console.log(tokens[i]);
}

换句话说,&#34;包含&#34;我添加到Array原型的函数作为最后一个元素出现在for循环中(但是数组长度为2)。为什么呢?

1 个答案:

答案 0 :(得分:3)

  

为什么?

因为for-in doesn't loop through array entries,它会遍历对象的可枚举属性。您已在Array.prototype上创建了一个新的可枚举属性,因此该属性显示在任何数组的for-in循环中。

解决方案是:

  1. 不要那样做,而是遍历数组in any of several ways that don't have that problem

  2. 使用hasOwnProperty过滤掉继承的属性(请参阅上面的链接了解更多信息)或

  3. 通过contains或类似内容将Object.defineProperty定义为不可枚举的属性(您只能在ES5 +引擎上执行此操作,无法对其进行填充)。