在ES5中使用Constructor函数的私有成员变量的最佳实践是什么

时间:2017-06-01 02:28:11

标签: javascript jquery ecmascript-6 ecmascript-5

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

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等方式访问这些广告。

另一方面,用email声明this._email = email一切正常,但这并不能保护隐私,因为我可以直接访问它作为对象属性,而无需访问方法。

我想知道的事情:

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

2 个答案:

答案 0 :(得分:2)

试试这个:

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... }

答案 1 :(得分:2)

使用var声明的变量只驻留在函数的范围内。

要获得私有财产,您可以做的最好的事情是将它们命名为明显私密,并希望人们不会来并改变它们。下划线是一种不错的方式。

您还可以使用函数和闭包来获取花哨的技巧,但在一天结束时,它们将不是属性。