Есть ли причина использовать Object.create () или новый в JavaScript? - PullRequest
8 голосов
/ 07 июля 2011

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

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

Ответы [ 4 ]

13 голосов
/ 07 июля 2011

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

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,

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

3 голосов
/ 17 октября 2016

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

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

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, так как в большинстве ситуаций требуется менее динамичная ситуация и больше требуется наследование.

3 голосов
/ 10 февраля 2013

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

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

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

var bar = createBar();
0 голосов
/ 23 августа 2017

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

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

    Object.setPrototypeOf(obj, proto);

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

    return obj;
}
...