Почему Крокфорд говорит не использовать новое ключевое слово, если он советует нам использовать его для прототипного наследования?
Я увидел видео, в котором Крокфорд сказал нам не использовать ключевое слово new
. Он сказал, чтобы вместо этого использовать Object.create, если я не ошибаюсь. Почему он говорит нам не использовать new
, если он использовал его для достижения прототипного наследования в этой статье, который он написал: http://javascript.crockford.com/prototypal.html
Я ожидаю, что он будет использовать Object.create вместо new
, например:
function object(o) {
return Object.create((function() {}).prototype = o);
}
Так почему же он все еще использует new
?
Ответы
Ответ 1
Крокфорд обсуждает new
и Object.create
в это сообщение в ноябре 2008 года в список рассылки JSLint.com. Выдержка:
Если вы вызываете функцию-конструктор без префикса new
, вместо создания и инициализации нового объекта, вы будете наносить ущерб глобальный объект. Отсутствует предупреждение о времени компиляции и время выполнения предупреждение. Это один из плохих частей языка.
В моей практике я полностью избегаю использования new
.
Ответ 2
Это действительно старый вопрос, но...
Когда Крокфорд написал статью, которую вы упомянули и обсуждение, связанное с Полом Beusterien, не было Object.create
. Это было в 2008 году, а Object.create
было, самое большее, предложением (или действительно редко реализованным в браузерах).
Его окончательная формулировка в основном представляет собой polyfill:
if (typeof Object.create !== 'function') {
Object.create = function (o) {
function F() {}
F.prototype = o;
return new F();
};
}
newObject = Object.create(oldObject);
Его единственное использование new
заключается в том, чтобы имитировать (или эмулировать) то, что должен делать Object.create
.
Он не советует нам использовать его. Он представляет polyfill, который использует его, поэтому вам не нужно использовать его где-либо еще.