Крокфорд приводит пример для функции создания объекта, которая должна была быть предоставлена самим Дж. С. в одном из его выступлений на Javascript, доступных на http://developer.yahoo.com/yui/theater/
Однако сама команда YUI (3) использует «new», и они действительно следуют его рекомендациям (так как он является главным архитектором JS в Yahoo (ОБНОВЛЕНИЕ: он продолжил, но утверждение было верным, когда этот ответ был первоначально написан) Я понимаю, что это конкретное утверждение относится скорее к «академическому» уровню, то, что ДОЛЖНО быть, если бы язык был разработан «правильно», а не с некоторыми остатками основанного на классах наследования. Он (ИМХО справедливо) говорит, что путь оказалось, что JS конфликтует, основывается на прототипах, но с этим одним из языков наследования "классического класса".
Тем не менее, JS как есть, иди и используй «новый».
Вы можете найти его функцию создания объекта здесь: http://javascript.crockford.com/prototypal.html
if (typeof Object.create !== 'function') {
Object.create = function (o) {
function F() {}
F.prototype = o;
return new F();
};
}
newObject = Object.create(oldObject);
РЕДАКТИРОВАТЬ: Обновлено, чтобы использовать последнюю версию этой функции Крокфорда - их три.
ОБНОВЛЕНИЕ Июнь 2015: у нас уже довольно давно Object.create(...)
, которые поддерживаются всеми современными браузерами (включая IE 9 и выше), поэтому в этом не было необходимости использовать функцию Крокфорда.
Однако , получается, что если вы используете Object.create
, вам следует убедиться, что вы не делаете это много: эта функция работает НАМНОГО медленнее, чем new Constructor()
!
См. http://mrale.ph/blog/2014/07/30/constructor-vs-objectcreate.html для объяснения (для двигателя V8) и см. http://jsperf.com/object-create-vs-crockford-vs-jorge-vs-constructor/62 для демонстрации производительности.
Другая причина не отворачиваться от new Constructor(...)
заключается в том, что ES6 классы наверняка увидят широкое распространение, даже если только по той простой причине, что большинство разработчиков Javascript приходят из языков на основе классов.
Также ознакомьтесь с этой статьей, в которой утверждается для Object.create
: http://davidwalsh.name/javascript-objects-deconstruction
Нравится вам это или нет, особенно в проектах, которыми вы хотите поделиться с широким кругом людей (в пространстве и времени - то есть правильно или со временем, когда другие люди переходят от вас), есть и другие причины для использования new
.
ОБНОВЛЕНИЕ Сентябрь 2015: Для себя я начал использовать ES 2015 Javascript для всего - используя io.js и / или Babel. Я также не использую any new
в своих проектах, за исключением встроенных Javascript, таких как new Error(...)
. Я предпочитаю использовать гораздо более мощный функциональный подход, я полностью игнорирую объектную систему. [my-object].prototype
и this
полностью исчезли из моих проектов. Долгое время я ОЧЕНЬ скептически относился к этим идеям «потому что объекты работают просто отлично». Но после того, как он очень неохотно попробовал в начале нового проекта (io.js), он «щелкнул», и я не понимаю, почему я потратил два десятилетия впустую. Ладно, не совсем, сегодня движки и аппаратные средства JS гораздо более благоприятны для этого стиля. Особенно в ES 2015, я рекомендую попробовать функциональный стиль, полностью свободный от любых this
и class
(новое ключевое слово ES 2015 или вся концепция, основанная на использовании constructorFn.prototype
). Это может занять несколько недель, но как только это «щелкнет», я обещаю, что вы никогда не вернетесь - не добровольно. Это намного удобнее и мощнее.
ОБНОВЛЕНИЕ Февраль 2018: Хотя я все еще делаю то, что написал в предыдущем обновлении, теперь я хочу добавить, что иногда классы в порядке. Там нет абсолютов. : -)