Подтвердить что ты не робот

Почему Крокфорд говорит не использовать новое ключевое слово, если он советует нам использовать его для прототипного наследования?

Я увидел видео, в котором Крокфорд сказал нам не использовать ключевое слово new. Он сказал, чтобы вместо этого использовать Object.create, если я не ошибаюсь. Почему он говорит нам не использовать new, если он использовал его для достижения прототипного наследования в этой статье, который он написал: http://javascript.crockford.com/prototypal.html

Я ожидаю, что он будет использовать Object.create вместо new, например:

function object(o) {
    return Object.create((function() {}).prototype = o);
}

Так почему же он все еще использует new?

4b9b3361

Ответ 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, который использует его, поэтому вам не нужно использовать его где-либо еще.