【发布时间】: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 用于id 和name 之类的变量时,它们的行为类似于私有成员,但我无法通过getId() 和getName() 等在Employee.prototype 上定义的方法访问它们。
另一方面,用this._email = email 声明email 可以正常工作,但这并不能保护隐私,因为我可以直接访问它作为对象属性,而无需访问方法。
我想知道的:
- 使用构造函数时声明私有变量的最佳方式是什么?
- 如果我使用
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