【问题标题】:Function as a class - create getters and setters for private properties作为类的函数 - 为私有属性创建 getter 和 setter
【发布时间】: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


【解决方案1】:

不,如果你想要一个私有属性,根据定义,它是构造函数的局部变量,那么显然访问它的方法也必须在构造函数中定义。

许多人担心在原型上定义一次方法而不是在每个实例上定义一次会影响效率。这可能是十年前的一个有效问题,或者今天在创建数千或数百万个对象的应用程序中。否则,实际上这不是您需要担心的事情。

【讨论】:

  • 最后一块是困扰我的 - 实现的效率。我想没有“正确”或“错误”的方式,但这取决于具体情况?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-10-09
  • 2018-03-11
  • 2021-08-08
  • 2017-06-27
  • 2010-11-16
  • 2019-04-30
相关资源
最近更新 更多