2013-10-08 52 views
4

我想弄清楚如何将一个itertor添加到一个JavaScript类,使得该类可以用于for ... in循环中。遵循Mozilla的指示不会产生他们声称的结果。 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Iterators_and_Generators 的jsfiddle给出例子:http://jsfiddle.net/KQayW/将一个自定义迭代器添加到一个javascript类

function Range(low, high){ 
    this.low = low; 
    this.high = high; 
    this.current = low; 
    this.next = function() { 
    if (this.current > this.range.high) 
     throw StopIteration; 
    else 
     return this.current++; 
    } 
} 
function RangeIterator(range){ 
    this.range = range; 
    this.current = this.range.low; 
} 
RangeIterator.prototype.next = function(){ 
    if (this.current > this.range.high) 
    throw StopIteration; 
    else 
    return this.current++; 
}; 
Range.prototype.__iterator__ = function(){ 
    return new RangeIterator(this); 
}; 
var range = new Range(3, 5); 
for (var i in range) 
    document.getElementById("test").innerHTML = i+"</br>"; // prints 3, then 4, then 5 in sequence 

它不会打印出该范围的数字,它打印出“__iterator__”!

有谁知道如何让这个工作?

回答

4

Mozilla文档声明Iterators功能是在JavaScript 1.7中引入的。尽管Chrome支持1.7以上的一些功能,但并不完全支持,所以这不起作用。如果你在最新的Firefox版本中测试你的代码,尽管你会看到它的工作原理。

尽管您可能想追加范围值而不是替换整个div。

http://jsfiddle.net/KQayW/2/

function Range(low, high){ 
    this.low = low; 
    this.high = high; 
    this.current = low; 
    this.next = function() { 
    if (this.current > this.range.high) 
    throw StopIteration; 
    else 
    return this.current++; 
    } 
} 
function RangeIterator(range){ 
    this.range = range; 
    this.current = this.range.low; 
} 
RangeIterator.prototype.next = function(){ 
    if (this.current > this.range.high) 
    throw StopIteration; 
    else 
    return this.current++; 
}; 
Range.prototype.__iterator__ = function(){ 
    return new RangeIterator(this); 
}; 
var range = new Range(3, 5); 
for (var i in range) 
    document.getElementById("test").innerHTML += i+"</br>"; // prints 3, then 4, then 5 in sequence 
+0

哈。谢谢!我想我没有仔细阅读。 – anonymouse

4

随着ES2015以其简单:

function Range(start, end) { 
    var ret = {}; 
    ret[Symbol.iterator] = function *() { 
     while (start < end) 
      yield start++; 
    } 
    return ret; 
} 

虽然你必须使用:

for (var x of Range(1, 10)) 
1

有了ES2015它可以更加简单

const Range = (start, end) => ({ 
 
    *[Symbol.iterator]() { 
 
    while (start < end) 
 
     yield start++; 
 
    } 
 
}) 
 

 
for (var x of Range(1, 10)) { 
 
    console.log(x) 
 
}

相关问题