Для того, что вы хотите, лучший способ, вероятно, это:
/**
* @constructor
*/
function Person(name) {
this.getName = function() {
return name;
};
}
Почему это? Ну, во-первых, инкапсуляция. Если возможно, вы обычно хотите поместить функцию в прототип, например, так:
/**
* @constructor
*/
function Person(name) {
this.name = name;
}
Person.prototype.getName = function() {
return this.name;
};
Однако! В этом случае оказывается, что вы не хотите, чтобы Person.name
был доступен. По этой причине вам нужно использовать замыкания.
Что касается этого метода:
var Person = function (name) {
this.name = name;
Person.prototype.getName = function () { return this.name; }
}
Это не хорошо. Вы публично выставляете this.name
, поэтому он не дает никаких преимуществ по сравнению с предыдущим методом-прототипом, но вы постоянно перезаписываете Person.prototype.getName
одной и той же функцией. Там нет смысла делать это; this
будет подходящим объектом каждый раз. Более того, Person.prototype.getName
не будет доступен, пока не будет создан первый объект Person
, поэтому нет особого смысла делать его "публичным" в первую очередь. Ваш четвертый пример в основном идентичен, с большим количеством глупостей, которые труднее понять, но у него все еще есть все недостатки.
Итак, в этом случае перейдите к первой версии; однако, когда это возможно, установите методы на prototype
, чтобы их можно было вызывать вне экземпляра.
Наконец, я бы порекомендовал использовать:
function Person() {
}
над
var Person = function() {
}
потому что 1) во втором примере пропущена точка с запятой, 2) var
подразумевает, что конструктор является переменной, которой не должно быть, и 3) я не верю, что JDoc позволяет применять к нему @constructor
, вызывая предупреждение в Closure Compiler как минимум 1 .
1 Хорошо, не так важно. Но все же ...