Симуляция СтопИтерации Rhino для другого движка JS - PullRequest
0 голосов
/ 04 апреля 2011

Интересно, как мне смоделировать StopIteration носорога (и spidermonkey?) В других движках JS (по крайней мере, IE6 + и Chrome). Следующие условия должны выполняться.

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

Ответы [ 3 ]

0 голосов
/ 26 февраля 2012

... но многие вещи 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 голосов
/ 12 марта 2013

Как насчет:

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

Это соответствует исходным двум условиям и исправляет два примера Скотта, поэтому они возвращают false (new Error() instanceof SI и new TypeError() instanceof SI). Другие три все еще возвращают истину все же. Также SI instanceof Function возвращает значение true, а StopIteration instanceof Function возвращает значение false.

Если объекту может быть предоставлен внутренний метод [[HasInstance]] (который требуется использовать для него справа от instanceof), не являющийся Function, тогда можно будет решить эти другие проблемы. Хотя я не знаю, как это сделать.

0 голосов
/ 05 апреля 2011

LOL, я не мог поверить в то, что нашел.Я могу просто использовать JS's 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

, вы можете попробовать его на панели URL браузера: javascript: SI = Object; alert(SI === SI); alert(SI instanceof SI);

Однако я не проверял это на Chrome, хотя думаю, что он будет работать.

Обновление 5/23 / 2011

Протестировано в Chrome и работаеткак и ожидалось.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...