Правильный способ создания объекта - PullRequest
0 голосов
/ 10 февраля 2012

Как правильно создать объект (с его "пространствами имен" и т. Д.) 2

//Company object
Apple = {

   employee: function(name) {
      this.name = name;
   }

}

ИЛИ по-другому?Стреляй.

Прочитай что-нибудь про прототипы и тому подобное.Как правильно это сделать;преимущества и недостатки?

1 Ответ

4 голосов
/ 10 февраля 2012

Во-первых, вы забыли var для Apple.Но в остальном это в основном одно и то же.

Во-вторых, в моих примерах я не собираюсь использовать атрибут name, поскольку при работе с функциями name по умолчанию является пустой строкой.По крайней мере, в Node.js и Chrome.Поэтому вместо этого я буду использовать empName.

В примере Microsoft вы создаете пустой объект, а затем добавляете к нему атрибут после факта.

В AppleНапример, вы делаете объект с атрибутом сразу.

Это именно то, что имеет для вас наибольшее значение и что вы предпочитаете.Поскольку они более или менее эквивалентны.

Теперь это не имеет ничего общего с прототипами.Вот пример того, что вы сделали:

var Apple = { 
    employee: function(empName) {
        this.empName = empName;
    }
};

Apple.employee('Hank');
Apple.empName; // 'Hank'

А вот как вы могли бы сделать это с экземпляром (используя оператор new и prototype)

var Apple = function() {}; // base 'parent'

Apple.prototype.employee = function(empName) {
    this.empName = empName
};

var a = new Apple();
a.employee('Hank');
a.empName; // 'Hank'
Apple.empName; // undefined

Таким образом, prototype используется для добавления атрибутов к новым экземплярам объекта (используя «объект» свободно).Обратите внимание, что для доступа к employee в Apple, во втором примере вам нужно будет сделать что-то вроде

Apple.prototype.employee('Hank'); // doesn't really do much
Apple.empName; // undefined

// but you can call the employee prototype with a bound variable
// you'd do this if you don't want to make an instance of Apple
// but still want to use one of it's prototypes
var obj = {};
Apple.prototype.employee.call(obj, 'Hank');
obj.empName; // 'Hank'

// a practical use of accessing a prototype method is
// when wanting to convert a function's arguments
// to an array. function arguments are like an array,
// but until turned into one they are not completely the same
var func = function() {
    var args = Array.prototype.slice.call(arguments);
    var sum = 0;
    for(var i = 0, l = args.length; i < l; i++) {
        sum += args[i];
    }
    return sum;
};

func(1); // 1
func(1, 2, 3, 4, 5); // 15

Надеюсь, что это поможет.Также не создавайте прототипы объектов (например, {} или Object).Это небезопасно.Поскольку, по сути, каждая переменная в JavaScript является объектом, то любые добавленные к ним прототипы будут доступны для всех переменных.Таким образом, если бы вы сделали Object.prototype.xyz = 12, затем имели var obj = { a: 1, b: 2, c: 3} и затем попытались for(var key in obj) { console.log(key); }, вы бы получили следующие журналы: a, b, c и xyz ..., которые вам не нужны.

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