get
定义了一个属性访问器函数。当检索到foo
on 属性的值时o
,即使在代码中看起来不像函数调用,也会调用该函数,例如:
var a = o.foo; // Note that `foo` doesn't have () after it, it's not a function call
在这种情况下,它总是返回 17,但它可以做其他事情。例如,考虑一个圆圈:
var circle = {
radius: 7,
get circumference() { return 2 * Math.PI * this.radius; },
get area() { return Math.PI * this.radius * this.radius; }
};
console.log(circle.circumference); // 43.982297150257104
console.log(circle.area); // 153.93804002589985
circle.radius = 4;
console.log(circle.circumference); // 25.132741228718345
console.log(circle.area); // 50.26548245743669
如您所见,当我们访问我们使用访问器定义的两个属性时,分配给它们的函数被调用,即使属性访问看起来不像函数调用。
您还可以拥有在设置属性时调用的函数。不出所料,您使用set
而不是get
. :-)
您可以在规范的对象初始值设定项部分和MDN 上阅读有关此内容的更多信息。
该Object.getOwnPropertyDescriptor
调用返回一个描述您请求的属性的对象(在本例中为foo
)。您也可以在规范和MDN 上阅读更多相关信息。
引用 MDN:
属性描述符是具有以下某些属性的记录(TJC:例如对象) :
value
与属性关联的值(仅限数据描述符)。
writable
true
当且仅当与属性关联的值可以更改(仅限数据描述符)。
get
用作属性的 getter 的函数,或者undefined
如果没有 getter(仅限访问器描述符)。
set
用作属性设置器的函数,或者undefined
如果没有设置器(仅限访问器描述符)。
configurable
true
当且仅当此属性描述符的类型可以更改并且该属性可以从相应的对象中删除。
enumerable
true
当且仅当此属性在枚举相应对象的属性期间出现。