Почему Boolean.prototype снова является логическим объектом?(И то же самое для String и Number, но не для Date или RegExp?) - PullRequest
0 голосов
/ 31 мая 2018

В ES5 , Boolean.prototype является логическим объектом:

Логический объект-прототип сам по себе является логическим объектом (его [[Class]] равен "Boolean")значение которого равно false.

В ES6 / ES2015 это не так:

Логический объект-прототип является обычным объектом.Он не является логическим экземпляром и не имеет внутреннего слота [[BooleanData]].

В ES2016 это еще раз:

Логический прототип сам по себе является логическим объектом;он имеет [[BooleanData]] внутренний слот со значением false.

(и так же остается в ES2017.)

То же самое верно для Number.prototype иString.prototype - тогда как, с другой стороны, Date.prototype и RegExp.prototype также начинались как экземпляры их соответствующих [[Class]] в ES5.1, стали простыми Objects в ES6 и остались такими же с тех пор.

Возвращение в ES2016, по-видимому, не было предметом какого-либо предложения tc39 .

Почему эти изменения были сделаны в ES6, а затем (только) частично отмененыв ES2016?

(Этот вопрос не только для академического / исторического интереса: я работаю над диалектом JavaScript, который предназначен не для того, чтобы включать примитивные типы в штучной упаковке, но который все еще требует, чтобы объекты .prototype содержали всеметоды, которые можно вызывать на примитивных значениях, и хотя в особых случаях объекты .prototype являются единственными экземплярами их соответствующих [[Class]] объектов, я бы хотел понять, почему это может быть желательно.)

1 Ответ

0 голосов
/ 13 июня 2018

Мне не удалось найти полное объяснение того, почему эти объекты стали простыми Object s в ES6, но причина отката, по-видимому, заключается в том, что он вызвал непредвиденные проблемы: из "Number.prototype notбудучи экземпляром, тоже разрушает сеть »на esdiscuss.org :

V8 только что вчера изменил изменение в Canary, которое реализует новую семантику ES6 для Number.prototype (и Boolean.prototype)быть обычными объектами.К сожалению, это, кажется, ломает сеть.В частности, jsfiddle.net/#run не загружается сейчас.

На этой странице я вижу, что TypeError "Number.prototype.valueOf не является универсальным", добавляемым в эту функцию (вероятно, часть инструментов moo):

Number.prototype.$family = function(){
return isFinite(this) ? 'number' : 'null';
}.hide();

после вызова для Number.prototype.

AFAICS, что оставляет только один вариант: отказаться от этого изменения спецификации.

–Andreas Rossberg

И кажется, что откат не был применен к Date.prototype и RegExp.prototype, потому что они переносят изменяемое состояние:

Из pov безопасности важные длявозвращаются те, которые имеют изменяемое состояние, не заблокированное Object.freeze.В ES5 это был только Date.prototype.Из встроенных в ES6 ES5 теперь он включает RegExp.prototype из-за RegExp.prototype.compile.

- Марк С. Миллер

...