在ES5中,将私人成员变量具有构造函数功能的最佳实践是什么?



我阅读了一些文章和问题,但我仍然不明白如何实现这一目标。以下片段将帮助我解释我要做的事情:

function Employee(id, name, email){
    var _id = id;
    var _name = name;
    this._email = email;
}
Employee.prototype.getId = function(){
    return _id;
}
Employee.prototype.getName = function(){
    return this._name;
}
Employee.prototype.getEmail = function(){
    return this._email;
}

我继续创建了几个实例:

var emp1 = new Employee(1,'Brendan Eich','brendaneich@gmail.com');

当我使用 var进行 id&的变量时name他们的行为像私人成员一样,但我无法从getId()getName()等方法中访问它们,该方法在Employee.prototype上定义。

另一方面,用this._email = email宣布email的工作正常,但这并不能保留隐私,因为我可以直接访问Asan Object属性而无需访问方法。

我想知道的:

  1. 使用构造函数函数时声明私有变量的最佳方法是什么?
  2. 如果我使用 var声明变量,那么它将位于对象中?

尝试以下:

function Employee(id, name, email){
var _id = id; //private 
var _name = name; //private
this._email = email; //public

  var fooPrivate = function(){
      return ;
  }
  this.getId = function(){ //Public function
    fooPrivate(); //I can only be called inside other member functions
    return _id;
  }

  this.getName = function(){ //Public function
    //Note that you don't use this._name for private variables
    return _name;
  }

  this.getEmail = function(){ //Public function
   return this._email;
  }
}

使用构造函数函数时声明私有变量的最佳方法是什么?

如果我使用var声明变量,则它将位于对象中?

  function Employee{ //private only accessible here... }

var声明的变量仅位于函数范围中。

获得私人财产,您能做的最好的就是命名它们,以便它们显然是私人的,希望人们不会出现并将其变异。下划线是一种体面的方法。

您也可以通过功能和封闭来拉动花哨的技巧,但归根结底,它们不会是属性。

最新更新