【发布时间】:2015-10-14 12:34:21
【问题描述】:
按照我的想法,当创建一个新函数(代表一个类)时,在原型的帮助下定义附加函数被认为是一种很好的做法。如果在现有函数中通过this 声明函数,则会为每个实例创建它们,而我们不一定想要。
所以,我的问题是 - 如果我想拥有一个完全私有的属性并且只能通过 getter 和 setter 访问,是否甚至可以通过使用原型来实现?
这是一个例子:
function Item() {
var title = '';
this.setTitle = function(_title) {
title = _title;
};
this.getTitle = function() {
return title;
};
}
var car = new Item();
car.setTitle('car');
console.log(car.getTitle()); //car
console.log(car.title); // undefined
/*
Alternative
*/
function _Item() {
this.title = '';
}
_Item.prototype.setTitle = function(_title){
this.title = _title;
};
_Item.prototype.getTitle = function() {
return this.title;
};
var _car = new _Item();
_car.setTitle('car 2');
console.log(_car.getTitle()); // car
console.log(_car.title); // car
从上面的例子可以看出,在Item 的情况下,我在一个函数中声明了getter 和setter——这不是一个好习惯。但是通过这种方式,我设法将title 属性保密。但是,对于_Item,我使用的是原型方法,这是首选,但我的title 属性根本不是私有的。
那么,在 JavaScript 中创建“类”的私有属性的最佳方法是什么?
【问题讨论】:
-
不,如果你想要一个私有属性,它是构造函数的局部变量,那么显然访问它的方法也必须在构造函数中定义。
-
同上@torazaburo 所说的——私有属性是一个词法构造,根据定义,原型上的函数不能访问与构造函数相同的词法范围。
-
注意:它们是私有的变量,而不是属性。
-
当然,即使是第一个示例,您的
title也不是很私密,因为您已经为它定义了公共 getter 和 setter。
标签: javascript prototype