Есть ли причина использовать Object.создать () или создать в 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();

супер поздно к этой теме.. но я думаю, что важное различие, которое необходимо сделать, заключается в том, что, хотя конструкторы-это просто функции, новый оператор вызывает функцию и захватывает результирующий объект, который может быть полезен в динамической среде. Это позволяет ссылаться на свойства и методы во время выполнения конструктора, которые могут или не могут быть полезны в зависимости от ситуации. Если вас больше волнует наличие прототипа набора, но сам объект скорее статично, чем нет, Объект.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, когда вы заботитесь о динамическом объекте и меньше о прототипе цепь

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

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


точный исходный код объекта.функция create ():

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

    Object.setPrototypeOf(obj, proto);

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

    return obj;
}