Правильный способ создания объекта

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

1

//Company object
var Microsoft = {};

//Create an employee
Microsoft.employee = function(name) {
 this.name = name;
}

или

2

//Company object
Apple = {

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

}

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

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

1 ответ

Во-первых, вы забыли 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 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 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); } for(var key in obj) { console.log(key); } вы должны привести к следующим журналам: a, b, c и xyz... которые вы не захотите.

licensed under cc by-sa 3.0 with attribution.