在文字对象中创建属性

时间:2013-04-28 16:31:39

标签: javascript

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有什么作用?这是方法或财产还是其他什么? 它如何工作或如何设置属性或方法来对象?如果我完全忽略getset的使用,我会遇到麻烦吗?使用getset比使用.getOwnPropertyDescriptor()returnedobj.configurable更有优势而不是在没有使用的情况下定义属性。那些优点是否有任何优势。{{1}}方法将返回什么?如果它返回对象,我可以简单地{{1}}来访问可配置的属性值吗?

2 个答案:

答案 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 specon 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__。这可能是一个局部变量或其他东西,而且这些函数显然可以执行比我在这里显示的更复杂的操作。