我想知道如何在其他JS引擎(至少IE6 +和Chrome)中模拟StopIteration
rhino(和spidermonkey?)。必须满足以下条件。
StopIteration === StopIteration; // true
StopIteration instanceof StopIteration // true
更新2011-04-05 :
我在Mochikit中看到了StopIteration的实现,然后我检查了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 :(得分:0)
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中测试过,它按预期工作。
答案 1 :(得分: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
答案 2 :(得分:0)
怎么样:
var SI = function() {};
SI.prototype = Function.prototype;
这符合最初的两个条件,并修复了Scott的两个示例,因此它们返回false(new Error() instanceof SI
和new TypeError() instanceof SI
)。其他三个仍然是真实的。此外SI instanceof Function
返回true,而StopIteration instanceof Function
将返回false。
如果一个对象可以被赋予[[HasInstance]]
内部方法(需要在instanceof
的右侧使用它),而不是Function
,那么它可能是可能的解决这些其他问题。我不知道如何做到这一点。