var o, d;
o = { get foo() { return 17; } };
d = Object.getOwnPropertyDescriptor(o, "foo");
// d is { configurable: true, enumerable: true, get: /*the getter function*/, set: undefined }
对象内的get
有什么作用?这是方法或财产还是其他什么?
它如何工作或如何设置属性或方法来对象?如果我完全忽略get
和set
的使用,我会遇到麻烦吗?使用get
和set
比使用.getOwnPropertyDescriptor()
和returnedobj.configurable
更有优势而不是在没有使用的情况下定义属性。那些优点是否有任何优势。{{1}}方法将返回什么?如果它返回对象,我可以简单地{{1}}来访问可配置的属性值吗?
答案 0 :(得分:4)
get
定义属性访问者函数。当检索到foo
上的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 时,您还可以调用函数。不出所料,您使用set
而不是get
来做到这一点。 : - )
您可以在规范的object initializers部分和on MDN中详细了解这一点。
Object.getOwnPropertyDescriptor
调用返回一个描述您要求的属性的对象(在本例中为foo
)。您可以阅读更多相关信息in the spec和on MDN。
从MDN引用:
属性描述符是具有以下某些属性的记录(TJC:例如,对象):
value
与属性关联的值(仅限数据描述符)。
writable
true
当且仅当与属性关联的值可能被更改时(仅限数据描述符)。
get
一个用作属性的getter的函数,或者undefined
如果没有getter(仅限访问者描述符)。
set
一个函数,用作属性的setter,如果没有setter,则为undefined
(仅限访问者描述符)。
configurable
true
当且仅当可以更改此属性描述符的类型并且可以从相应对象中删除属性时。
enumerable
true
当且仅当在枚举相应对象的属性时显示此属性。
答案 1 :(得分:2)
get
是用于定义属性getter和setter的ECMAScript 5语法的一部分。
使用对象文字语法,它的定义如下:
var obj = {
__other_property__: null,
get foo() { return "bar"; },
set foo(v) { this.__other_property__ = v }
};
这使你可以在获取属性时调用getter函数的主体。
obj.foo = "oof";
console.log(obj.foo); // "bar"
console.log(obj.__other_property__); // "oof"
以上使用foo
设置不同的属性__other_property__
。这可能是一个局部变量或其他东西,而且这些函数显然可以执行比我在这里显示的更复杂的操作。