javascript属性访问器

Jef*_*rey 11 javascript accessor

在Javascript中,似乎使用属性访问器并不是那么常见(不像其他OO语言,例如Java).

如果我有一个Person名字的对象,定义为

function Person(name) {
   this.name = name;
}
Run Code Online (Sandbox Code Playgroud)

一个人的名字不会改变,但我确实希望能够在需要时访问它,所以我可以这样做:

function Person(name) {
   var name = name;
   this.getName = function() {
      return name;
   }
}
Run Code Online (Sandbox Code Playgroud)

即使在动态语言中,我认为使用getter和setter的原理应用与静态类型的OO语言相同(例如封装,添加验证,限制访问等)

这个问题可能会被认为是主观的,但我很好奇为什么这种行为不会更频繁出现(例如,如果一切都是公开的,Java开发人员就会疯狂).

在javascript中有一种"标准"的方法吗?我见过Object.defineProperty,但并非所有浏览器都支持.

Mat*_*ple 15

Javascript具有可拦截的属性访问器:

http://ejohn.org/blog/javascript-getters-and-setters/

恕我直言这是一个比Java更严格的显式获取者更好的强制执行统一访问原则的解决方案,但这也是该语言的简单性和不灵活性的一部分(例如Groovy允许类似的拦截).


Jer*_*her 7

我知道我对这个问题的看法.

吸毒者和制定者都是邪恶的.

等待!真!请耐心等待我,让我解释一下.

只是使用一个方法来获取和设置一个值是..好吧..有点无意义.它不保护,不是真的,你输入的是你得到的东西.

另一方面,我非常喜欢将信息放入其中的方法,然后将信息取回.但这里是神奇的部分!这是不一样的信息.不是直接的.

function Person(name) {
  this.getFullName = function() {return this.firstName + " " + this.lastName;};
  this.setBirthday = function(date) { this.birthday = date; };

  this.getAge = function() { /* Return age based on the birthday */ };
  this.isOfLegalDrinkingAge function() { /* do your math here too */ };
}
Run Code Online (Sandbox Code Playgroud)

但大多数时候我只是推送静态数据并获取静态数据.将它隐藏在吸气剂和制定者后面有什么意义?

作为次要原因,在处理DOM和大多数主机对象时,您需要设置属性.你不玩getter和setter.不使用它们符合JS编码器所做的其他"风格".