2011-04-04 59 views
0

我不知道如何可以在其它JS引擎(至少是IE6 +和Chrome浏览器)模拟犀牛(和SpiderMonkey的?)的StopIteration。以下条件必须成立。模拟犀牛的StopIteration其它JS引擎

StopIteration === StopIteration; // true 
StopIteration instanceof StopIteration // true 

更新2011-04-05

我看到的StopIteration的实施Mochikit,然后我检查了NamedError code。我在前面的代码中实现了以下代码库。然而,instanceof试验还是失败了。

NamedError = function (name) { 
    this.message = name; 
    this.name = name; 
}; 
NamedError.prototype = new Error; 
NamedError.prototype.constructor = NamedError; 

StpIter = new NamedError("StpIter") // just to see if I can simulate StpIter to be like Mozilla's StopIteration. 

print(StpIter === StpIter) // true 
print(StpIter instanceof StpIter) // false 

回答

0

大声笑,我简直不敢相信我找到了什么。我可以只使用JS的Object

Object === Object // true 
Object instanceof Object // true 

因此,应用在StopIteration异常

var SI = Object// using another object just to test my condition 
SI === SI // true 
SI instanceof SI // true 

你可以尝试一下您浏览器的地址栏上: javascript: SI = Object; alert(SI === SI); alert(SI instanceof SI);

不过,我还没有在Chrome测试这一点,但我认为它将工作。

更新2011/5/23

测试在Chrome和它按预期工作。

0

...但很多事情是instanceof Object
你的榜样:

var SI = Object 
undefined 
    SI === SI //true 

    SI instanceof SI  //true 

    Object instanceof SI  //true 

    Error instanceof SI  //true 

    new Error() instanceof SI  //true 

    TypeError instanceof SI  //true 

    new TypeError() instanceof SI  //true 
0

如何:

var SI = function() {}; 
SI.prototype = Function.prototype; 

这符合原来的两个条件,并修复了两个斯科特的例子,让他们返回false(new Error() instanceof SInew TypeError() instanceof SI)。其他三个仍然返回true。此外SI instanceof Function返回true,而StopIteration instanceof Function将返回false。

如果一个对象可以给予一个[[HasInstance]]内部方法(这是需要使用它的上instanceof的右侧),而不被一个Function,那么它可能是能够固定这些其他问题。我不知道有什么办法,虽然这样做。