2012-02-10 3 views
0

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

//Company object 
var Microsoft = {}; 

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

или

//Company object 
Apple = { 

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

} 

ИЛИ другой способ? Стрелять.

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

+0

Учитывая эти две возможности, все в порядке. Вам нужно только беспокоиться о прототипах, если у вас есть функция-конструктор и вы хотите создать более одного объекта «в своем роде». –

+0

@FelixKling Отредактировал мой вопрос, если вы знаете какой-либо лучший способ - пожалуйста, поделитесь. – Zar

+0

«Лучше» с точки зрения чего? –

ответ

4

Прежде всего, вы забыли 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 ... которые вы не захотите.

+0

Огромное спасибо за этот ответ, именно то, что я искал! – Zar

Смежные вопросы