Прежде всего, вы забыли 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
... которые вы не захотите.
Учитывая эти две возможности, все в порядке. Вам нужно только беспокоиться о прототипах, если у вас есть функция-конструктор и вы хотите создать более одного объекта «в своем роде». –
@FelixKling Отредактировал мой вопрос, если вы знаете какой-либо лучший способ - пожалуйста, поделитесь. – Zar
«Лучше» с точки зрения чего? –