5
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?那是一种方法或属性还是其他什么?它如何工作或如何将属性或方法设置为对象?如果我简单地忽略 and 的使用,我会遇到麻烦getset?使用 and 是否有更多的优势,getset不是简单地定义没有使用的属性。如果有的话,这些优势是什么。还有什么.getOwnPropertyDescriptor()方法会返回?如果它返回对象,我可以简单returnedobj.configurable地访问可配置的属性值吗?

4

2 回答 2

4

get定义了一个属性访问器函数。当检索到fooon 属性的值时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当且仅当此属性在枚举相应对象的属性期间出现。

于 2013-04-28T16:43:20.267 回答
2

get是用于定义属性 getter 和 setter 的 ECMAScript 5 语法的一部分。

使用对象字面量语法,它的定义如下:

var obj = {
    __other_property__: null,
    get foo() { return "bar"; },
    set foo(v) { this.__other_property__ = v }
};

这使您可以在对属性执行 get 时调用 getter 函数的主体。

obj.foo = "oof";
console.log(obj.foo); // "bar"
console.log(obj.__other_property__); // "oof"

以上用于foo设置不同的属性__other_property__。这可能是一个局部变量或其他东西,这些函数显然可以执行比我在这里展示的要复杂得多的操作。

于 2013-04-28T16:42:52.643 回答