阅读John Resig's article about Javascript getters and setters我在Javascript中看到了一个我不熟悉的结构:
Field.prototype = {
get value(){
return this._value;
},
set value(val){
this._value = val;
}
};
Prototype是一个像许多其他人一样的对象,但这里的get和set部分似乎并不熟悉。他们提到了什么名字?它们看起来不像对象的典型属性(遵循"key":"value"
语法),它们看起来也不像标准函数。
这个简单的语法糖是JS引擎转化为更易识别的东西吗?
更新
我的问题的真正症结在于:由于{ foo(){} }
不是有效的语法,因此在给定get
或set
运算符的情况下是什么使它有效? { get foo(){} }
答案 0 :(得分:4)
我花了一点时间阅读以确定如何使用它,所以虽然@RGraham指出了很多文档(https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/get),但我想我会提供一个用法示例
基本上,“get”和“set”运算符允许您覆盖直接访问成员变量时将获得的行为。
这意味着你可以,例如:
以上所有内容都可以(当然)通过定义对象上的函数来完成,不同之处在于函数必须这样调用。
使用此表示法,即使符号似乎引用成员变量,也会调用这些函数。
我个人不喜欢它 - 我想它可能导致一些非常混乱的代码,特别是在调试时。但是如果你想......那就可以使用它了。
实施例
var Field = {
get value(){
return this._value;
},
set value(val){
this._value = val + 1;
}
};
Field.value = 100
console.log( Field.value );
将输出:
101
在这里小提琴:http://jsfiddle.net/zV8Kf/1/
关于特定的“为什么{ get foo(){} }
有效?”问题:
我读到这个:
这意味着针对此对象的foo引用将返回undefined
您可以在此处查看此行为:
如果你认为get
是foo: function
的近似值(我知道它不完全,但确实说明了“我将定义一个函数 - 将它分配给它”,那么它是语法上类似于:
{ foo: function foo() {} }
无法将其与{ foo(){} }
进行比较,因为在此示例中,您不会告诉JavaScript您将要定义某些内容,也不会告诉您将其放置在何处。