2013-10-08 50 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) 
 
}

相關問題