Отказ от ответственности: я не защищаю инкапсуляцию в javascript. Но вот несколько уродливых способов сделать это.
Если все, что вам нужно, это уменьшить дублирование кода, то вы можете легко все настроить в «конструкторе», сделав его собственной фабрикой:
function Dog(name) {
let dogName = name;
let dog = Object.create(Dog.prototype);
dog.getName = function () {
return dogName;
};
dog.setName = function (name) {
dogName = name;
};
return dog;
}
let d2 = new Dog("Tony");
Если вы также хотите реально использовать прототип, вы можете использовать символы, чтобы в значительной степени скрыть свойство name:
Dog = function() {
const nameSymbol = Symbol("name");
function Dog(name) {
Object.defineProperty(this, nameSymbol, {
configurable: true,
enumerable: false,
writable: true,
value: name
});
}
Object.assign(Dog.prototype, {
getName : function () {
return this[nameSymbol];
},
setName : function (name) {
this[nameSymbol] = name;
}
});
return Dog;
}();
let d2 = new Dog("Tony");
Но символ все еще можно получить с помощью Object.getOwnPropertySymbols
, Поэтому, если вы ищете способ действительно сделать невозможным доступ к имени без использования метода получения / установки, я думаю, вам придется использовать WeakMap
:
Dog = function() {
const dogNames = new WeakMap()
function Dog(name) {
dogNames.set(this, name);
}
Object.assign(Dog.prototype, {
getName : function () {
return dogNames.get(this);
},
setName : function (name) {
dogNames.set(this, name);
}
});
return Dog;
}();
let d2 = new Dog("Tony");