Во-первых, вы забыли 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
..., которые вам не нужны.