Есть ли причина использовать 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;
}