Javascript OOP - 具有私有变量的非特权公共方法

时间:2015-11-16 22:20:54

标签: javascript oop

我试图找到一个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中它是否完全可能?

2 个答案:

答案 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偷走了这句话。给它一块手表。