Есть ли причина использовать Object.create() или новый в JavaScript?

Я использую new Ключевое слово в JavaScript до сих пор. Я читал о Object.create и мне интересно, если я должен использовать это вместо этого. Что я не совсем понимаю, так это то, что мне часто нужно запускать код сборки, поэтому я не понимаю, как Object.create будет работать вообще, так как не запускает никаких функций.

Может ли кто-нибудь сказать мне, в каком случае я должен использовать Object.create вместо new?

4 ответа

Решение

Пока что, если вы хотите создать объект, вы можете использовать только литералы:

var obj = {};

или Object конструктор.

var obj = Object();

Но ни один из этих методов не позволяет указать прототип созданного объекта.

Это то, что вы можете сделать с Object.create сейчас. Это позволяет вам создавать новый объект и устанавливает первый аргумент как прототип нового объекта. Кроме того, он позволяет вам устанавливать свойства нового объекта, представленного в качестве второго аргумента.

Это похоже на что-то вроде этого (без второго аргумента):

function create(proto) {
    var Constr = function(){};
    Constr.prototype = proto;
    return new Constr();
}

Так что, если вы используете конструкцию, похожую на эту, это, когда вы хотели использовать Object.create,

Это не замена для new, Это скорее дополнение для упрощения создания отдельных объектов, которые должны наследоваться от другого объекта.

Пример:

У меня есть объект a:

var a = {
   someFunction: function() {}
};

и я хочу b расширить этот объект. Тогда вы можете использовать Object.create:

b = Object.create(a);
b.someOtherFunction = function(){};

Всякий раз, когда у вас есть функция конструктора, но вы создаете из нее только один объект, вы можете заменить его на Object.create,

Существует общее правило, которое применяется. Это очень сильно зависит от того, что делает функция конструктора и как вы наследуете от других объектов и т. Д.

Как уже упоминалось, Object.create() обычно используется, когда вы хотите простой способ установить прототип нового объекта. Что другие ответы не могут упомянуть, однако, это то, что функции конструктора (которые требуют нового) не сильно отличаются от любой другой функции.

Фактически, любая функция может возвращать объект, и в JavaScript часто можно увидеть фабричные функции (например, конструкторы, но они не требуют newили используйте this ссылаться на новый объект). Заводские функции часто используют Object.create() установить прототип нового объекта.

var barPrototype = {
  open: function open() { /* ... */ },
  close: function close() { /* ... */ },
};
function createBar() {
  return Object.create(barPrototype);
}

var bar = createBar();

Слишком поздно для этого потока... но я думаю, что важное различие, которое необходимо сделать, состоит в том, что, хотя конструкторы являются просто функциями, новый оператор вызывает функцию и захватывает результирующий объект, который может быть полезен в динамической среде. Это позволяет ссылаться на свойства и методы во время выполнения конструктора, которые могут или не могут быть полезны в зависимости от ситуации. Если вас больше волнует наличие прототипа set, но сам объект более статичен, чем нет, то лучше будет использовать Object.create, так как он чище и не портит проток цепочку неожиданными способами, как оператор new,

несколько простых примеров..

var Foo = function(element) {
  this.elem = element;
  $(this.elem).css('color', 'blue');
  // using the new operator here gives access to this.elem
  // immediately after that declaration is made, thus providing 
  // a comfortable dynamic system to work with 
}

var bar = new Foo(someElem);

по сравнению с..

var foo = {
  elem : element,             // assume elem exists
  $(this.elem).css('color', 'blue')// in the lexical scope
}

var bar = Object.create(foo);
// This.elem does not exist until the object is returned now
// and the .css method call will not execute

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

Используйте New, если вам важно иметь динамический объект, а не цепочку прототипов

Используйте Object.create, когда вам меньше нужно быть динамичным, а больше - иметь явную цепочку прототипов. Я также отмечу, что объекты, созданные с помощью Object.create, также можно динамически создавать с помощью метода, называемого init что вы можете создать, чтобы назначать свойства в зависимости от ваших потребностей и просто вызывать его для только что возвращенного объекта.

У каждого подхода есть свои взлеты и падения, однако, на мой взгляд, их варианты использования довольно различны. Однако вы, скорее всего, обнаружите, что используете Object.create, так как в большинстве ситуаций требуется менее динамичная ситуация, и вам больше нужно наследование.

Точный исходный код для функции Object.create():

function Object.Create(proto, propertiesObject)
{
    var obj = {};

    Object.setPrototypeOf(obj, proto);

    if(propertiesObject)
    {
        Object.defineProperties(obj, propertiesObject);
    }

    return obj;
}
Другие вопросы по тегам