【问题标题】:What is the best practice for having private member variables with Constructor functions in ES5 [duplicate]在 ES5 中使用带有构造函数的私有成员变量的最佳实践是什么 [重复]
【发布时间】:2017-11-02 00:18:07
【问题描述】:

我在这里阅读了一些文章和问题,但我仍然不明白如何实现这一点。以下 sn-p 将帮助我解释我正在尝试做的事情:

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 用于idname 之类的变量时,它们的行为类似于私有成员,但我无法通过getId()getName() 等在Employee.prototype 上定义的方法访问它们。

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

我想知道的:

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

【问题讨论】:

  • 最佳做法是将它们设置在 this 上,并带有下划线前缀,就像您对 this._email 所做的那样。您在构造函数中使用 var 声明的任何内容都将无法从其范围之外访问;这些变量根本不在对象中。
  • 如果你想强制隐私,你可以在构造函数中定义 getter 方法(和 setter 方法,如果需要),它们可以访问局部变量。 this.getId = function() { return _id }
  • javascript 有许多语言“原生”的特性,但不幸的是隐私不是其中之一。开发人员的总体共识是简单地在任何私有标识符前加上下划线。这告诉其他开发者他们不应该触摸标识符,但它也不阻止他们这样做。 This article by philipwalton explains a way of getting real privacy working in javascript (where external devs can't touch private members).
  • @BeingSuman read crockford's article I referred to。它很旧(从 2001 年开始),但它解释了在构造函数中声明的变量在 ES3-ES5 术语中的行为方式。
  • 拥有“真正的”隐私也没有任何意义(您可以通过WeakMaps 获得它,但何必呢?);不要使用诸如在构造函数中分配函数之类的技巧来尝试获取它。

标签: javascript jquery ecmascript-6 ecmascript-5


【解决方案1】:

试试这个:

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

【讨论】:

  • getName() 需要return _name
  • 您的帖子实现了隐私的目标,但我不建议使用这种模式,因为您在每次构造函数调用时都会创建方法的新实例。如果你在原型上定义函数,那么它们就不会被重用
  • 我不知道。绝对要牢记。
  • Opps 大错别字:我的意思是如果你在原型上定义函数,那么它们就不会被重用。
【解决方案2】:

var 声明的变量只存在于函数的范围内。

要获得私有属性,您能做的最好的事情就是命名它们,这样它们显然是私有的,并希望人们不要出现并改变它们。下划线是一种不错的方式。

你也可以用函数和闭包来做一些花哨的技巧,但归根结底,它们不会是属性。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-11-10
    • 1970-01-01
    • 2020-01-11
    • 1970-01-01
    • 2010-11-14
    • 2022-11-04
    • 1970-01-01
    相关资源
    最近更新 更多