Инициализация объекта Javascript, что является лучшим способом сделать это? - PullRequest
4 голосов
/ 25 декабря 2010

Инициализация объекта:

var myObject = {};

и

var myObject = new Object();

почему последний считается антипаттерном?

спасибо

Ответы [ 4 ]

7 голосов
/ 25 декабря 2010

Я не уверен, new Object() действительно подпадает под "анти-паттерн", но обычно предпочитается {}, он краткий и более гибкий одновременно.

Когда вы пишете JavaScriptВы хотите, чтобы он был коротким ... если он может быть кратким и понятным при написании, например:

var myObject = { key: "value" };

... тогда вы получите лучшее из обоих миров.Также, когда вы создаете объекты внутри объектов, например:

var myObject = { subObj: { key: "value" } };

... тогда вы можете видеть, что он намного более читабелен, чем альтернативный синтаксис new Object().

4 голосов
/ 25 декабря 2010

Вы всегда должны предпочитать литералы конструкторам.

Это на самом деле не связано с вашим вопросом, но вот пример с массивами.new Array() может на первый взгляд сбить с толку, если вы не знаете, как это работает:

var a = [5,6];
var b = [5];

оба создают массивы длиной 2 и 1 соответственно.Но рассмотрим

var a = new Array(5,6);
var b = new Array(5);

Первый создает массив длины 2, содержащий элементы 5 и 6, последний создает пустой массив длины 5.

Итак, вы видите, использование литеральных обозначений позволяет избежать этой ловушки.

Кроме того, всегда использование литеральных обозначений является последовательным.Когда вы создаете строку, вы также пишете var t = "Hello world", а не var t = new String("Hello world").

1 голос
/ 25 декабря 2010

Хорошо, анти-паттерн из-за проблемы с конструкторами массивов, это просто соглашение по-прежнему использовать литералы {} вместо конструкторов в объектах new Object, См. Руководства по JavaScript Google .

0 голосов
/ 25 декабря 2010

Почти всегда, да

Я думаю, что говорить что-то вроде «всегда следует предпочесть это» слишком обобщенно, всегда есть исключения. Объектные литералы почти всегда предпочтительны, но что делать, когда вы пытаетесь клонировать сложные наборы объектов ?? Или пытаться создать экземпляр module ?

if (typeof Object.create !== 'function') {
    Object.create = function (o) {
        function F() {}
        F.prototype = o;
        return new F();
    };
}
newObject = Object.create(oldObject);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...