さて、Chrome で のポリフィルを使用しようとしているときに疑問に思いましたObject.watch
。
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/watch
https://gist.github.com/eligrey/384583
ポリフィルは非常に短いもので、元のプロパティを削除してすぐに同じ値の新しいプロパティを定義する方法を読むことができますが、getter と setter をオーバーライドします。
問題は、このポリフィルを使用して op を監視する場合です。
var o = { p: 1 };
o.watch("p", function (id, oldval, newval) {
console.log( "o." + id + " changed from " + oldval + " to " + newval );
return newval;
});
その後、o
chrome devtool でオブジェクトを確認します。バン!オブジェクトo
は空です! 実際にはまだプロパティp
, type o.p
you'll find がありますo.p = 1
。
私の質問は、Chrome 開発者ツール オブジェクトのプロパティ リストの下にプロパティが表示されないのはなぜですか?
注: を知らない/興味がないObject.watch
場合でも、よく理解している限り、この質問について私を助けることができるかもしれませんObject.defineProperty
。
編集: getter と setter をオーバーライドするだけで、新しいプロパティを作成すると思っていたようなものではないことがわかりました。https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/definePropertyからの引用 "オブジェクトに存在するプロパティ記述子には、データ記述子とアクセサー記述子の 2 つの主要な種類があります。データ記述子書き込み可能または書き込み不可の値を持つプロパティです。アクセサ記述子は、関数の getter-setter ペアによって記述されるプロパティです。
したがって、ポリフィルはターゲット プロパティを「データ プロパティ」から「アクセサ プロパティ」に変更するようです。これをポリフィルする唯一の方法だと思いますか?