模拟其他JS引擎的Rhino的StopIteration

时间:2011-04-04 14:39:05

标签: javascript rhino

我想知道如何在其他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

3 个答案:

答案 0 :(得分: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中测试过,它按预期工作。

答案 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 SInew TypeError() instanceof SI)。其他三个仍然是真实的。此外SI instanceof Function返回true,而StopIteration instanceof Function将返回false。

如果一个对象可以被赋予[[HasInstance]]内部方法(需要在instanceof的右侧使用它),而不是Function,那么它可能是可能的解决这些其他问题。我不知道如何做到这一点。