我试图找到一个javascript OOP方法,其中变量应该是私有的(不能从外部访问)使用非特权方法。
以下示例应演示它:
var Person = (function() {
var _name;
var _surname;
var _personID;
function Person(name, surname, personID) {
_name = name;
_surname = surname;
_personID = personID;
}
Person.prototype.getName = function() {
return _name;
};
Person.prototype.getSurname = function() {
return _surname;
};
Person.prototype.getPersonID = function() {
return _personID;
};
return Person;
})();
//Testing
var max = new Person('Max', 'Smith', 2345);
max._name = 'John';
console.log(max.getName()); // Max
console.log(max.getSurname()); // Smith
console.log(max.getPersonID()); // 2345
似乎满足条件,因此max._name = 'John'
不会更改值,并且方法仍然获取私有值(不使用.this)
但问题是,创建另一个对象显然是同一个对象,它指的是相同的值:
//Testing
var max = new Person('Max', 'Smith', 2345);
var max2 = new Person('Max2', 'Smith2', 2345);
console.log(max.getName()); // Max2
console.log(max.getSurname()); // Smith2
console.log(max.getPersonID()); // 2345
console.log(max2.getName()); // Max2
console.log(max2.getSurname()); // Smith2
console.log(max2.getPersonID()); // 2345
如何在不公开值的情况下创建不同的对象?在Javascript中它是否完全可能?
答案 0 :(得分:3)
Javascript中是否可以使用它?
不,不是。停止搜索,你永远不会找到方法 只使用特权方法,它们没有任何问题。
答案 1 :(得分:1)
也许这就是你要找的东西。我还包括一些动物代码,以演示如何进行继承。实际上,我认为你可以放弃新的'关键字(虽然可能会在幕后重新添加,但不确定)。
http://plnkr.co/edit/6nW3DtqJWEu7fZ29GMOC?p=preview
var Person = (function(){
function Person(name, surname, personId){
var _name = name, _surname = surname, _personId = personId;
return Object.freeze({
getName: getName,
getSurname: getSurname,
getPersonID: getPersonID
});
function getName(){
return _name;
}
function getSurname(){
return _surname;
}
function getPersonID(){
return _personId;
}
}
return Person;
})();
var max = new Person('Max', 'Smith', 2345);
var max2 = Person('Max2', 'Smith2', 2346);
max._name = 'John';
console.log(max.getName()); // Max
console.log(max.getSurname()); // Smith
console.log(max.getPersonID()); // 2345
console.log(max2.getName()); // Max2
console.log(max2.getSurname()); // Smith2
console.log(max2.getPersonID()); // 2346
编辑:我不确定我的解决方案是否符合“非特权”标准。基于Douglas Crockford's definition。我相信该页面已过时,并且我使用Object.freeze()使用他的新语法,这意味着无法再删除或更改公共方法。
Edit2:我无耻地从The Better Parts偷走了这句话。给它一块手表。