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の使用を単純に無視すると、問題が発生しますか? getandを使用すると、プロパティを使用せずに単純に定義するよりも多くの利点があります。オブジェクトが返された場合、構成可能なプロパティ値にアクセスすることはできますか?setgetset.getOwnPropertyDescriptor()returnedobj.configurable

4

2 に答える 2

4

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 

ご覧のとおり、アクセサーで定義した 2 つのプロパティにアクセスすると、プロパティ アクセスが関数呼び出しのように見えなくても、それらに割り当てられた関数が呼び出されます。

プロパティが設定されたときに呼び出される関数を持つこともできます。当然のことながら、setではなくを使用してそれを行いますget。:-)

これについては、仕様のオブジェクト初期化子の部分とMDNで詳しく読むことができます。

このObject.getOwnPropertyDescriptor呼び出しは、要求したプロパティ (この場合はfoo) を説明するオブジェクトを返します。詳細については、仕様MDNでも読むことができます。

MDN からの引用:

プロパティ記述子は、次の属性の一部を持つレコード(TJC: オブジェクトなど)です。

value
プロパティに関連付けられた値 (データ記述子のみ)。
writable
trueプロパティに関連付けられた値が変更される可能性がある場合のみ (データ記述子のみ)。
get
プロパティのゲッターとして機能する関数、またはundefinedゲッターがない場合 (アクセサー記述子のみ)。
set
プロパティのセッターとして機能する関数、またはundefinedセッターがない場合 (アクセサー記述子のみ)。
configurable
trueこのプロパティ記述子の型が変更される可能性があり、対応するオブジェクトからプロパティが削除される可能性がある場合に限ります。
enumerable
true対応するオブジェクトのプロパティの列挙中にこのプロパティが表示される場合にのみ。

于 2013-04-28T16:43:20.267 に答える
2

getプロパティのゲッターとセッターを定義するための 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 に答える