Обновление
Вы ищете @name
, который является переменной экземпляра.Молитесь, чтобы это было в es.next, но у нас его пока нет.Может быть, через два года.
Если вы заботитесь о чистом API, вот ваше решение:
function Class(foo) {
Class.priv(this).foo = foo;
}
Class.priv = (function() {
var cache = [],
uid = 1;
return function(obj) {
if (!this.__id) {
this.__id = uid;
cache[uid++] = {};
}
return cache[this.__id];
};
}());
Class.prototype.bar = function() {
console.log(Class.priv(this).foo);
}
Сохраните все данные в кэше как функцию конструктора.Никакие данные не загромождены на объекте.
Оригинал
Однако не существует такой вещи, как "частный".
Все, что вы можете сделать, это создатьлокальная переменная внутри функции.
Функция конструктора
var Human = function(name) {
// local variable.
var _name = name;
}
Имеет локальную переменную, которая по определению локальной не может использоваться вне функции конструктора.
Это означает, что вы не можете получить к нему доступ во внешнем коде, как в прототипе.
Однако вы можете сделать его доступным только для чтения, используя ES5
var Human = function(name) {
Object.defineProperty(this, "name", { value: name });
}
Если выможет действительно достичь того, что вы просите, вы бы сделали огромный прорыв в JS.Я пытался делать это в течение многих часов.
Другой шаблон будет выглядеть так:
var Human = function(name) {
this.name = name;
return {
Shout: this.Shout.bind(this)
};
}
Human.prototype.Shout = function() {
console.log(this.name);
}
Это накладные расходы на вызов .bind
и создание нового объекта для каждого экземпляра.хотя.