2

さて、Chrome で のポリフィルを使用しようとしているときに疑問に思いましたObject.watchhttps://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;
});

その後、ochrome devtool でオブジェクトを確認します。バン!オブジェクトoは空です! 実際にはまだプロパティp, type o.pyou'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 ペアによって記述されるプロパティです。

したがって、ポリフィルはターゲット プロパティを「データ プロパティ」から「アクセサ プロパティ」に変更するようです。これをポリフィルする唯一の方法だと思いますか?

4

1 に答える 1

2
私の質問は、Chrome 開発者ツール オブジェクトのプロパティ リストの下にプロパティが表示されないのはなぜですか?

答えは: 表示されますが、現在はゲッターとセッターです。

Object {}
get p: function () {
set p: function (val) {
__proto__: Object

jsfiddle

ただし、値が表示されない理由を尋ねている場合は、値が非公開になり、getter を使用してのみ読み取ることができるためです。

console.log(o.p);

更新: Mutator メソッドの読み取り

ミューテーター法

フリー百科事典ウィキペディアより

コンピューター サイエンスでは、ミューテーター メソッドは、変数への変更を制御するために使用されるメソッドです。これらは、'''setter''' メソッドとしても広く知られています。多くの場合、setter には、プライベート メンバー変数の値を返す '''getter''' (アクセサーとも呼ばれます) が伴います。「セッター」とも呼ばれるミューテーター メソッドは、カプセル化の原則に従って、オブジェクト指向プログラミングで最もよく使用されます。この原則に従って、クラスのメンバー変数は非公開にして他のコードから保護し、必要な新しい値をパラメーターとして取り、必要に応じて検証するパブリック メンバー関数 (ミューテーター メソッド) によってのみ変更できます。それを変更し、プライベート メンバー変数を変更します。

この例を考えてみましょう

function MyClass() {
    var privateVar = 0;

    this.getPrivate = function () {
        return privateVar;
    }

    this.setPrivate = function (value) {
        privateVar = value;
    }
}

var newObject = new MyClass();

console.log(newObject);

console.log(newObject.getPrivate());

出力

MyClass {getPrivate: function, setPrivate: function}
getPrivate: function () {
setPrivate: function (value) {
__proto__: MyClass

0

の上jsfiddle

オブジェクトを表示し、パブリック メソッドgetPrivatesetPrivate(によって作成された非常にリアルなゲッターとセッターに似てObject.definePropertyいます) を確認できますが、メンバー変数の値は確認できませんprivateVariablegetPrivatepublic メソッドを呼び出すことによってのみ、値を表示できます。

于 2013-07-18T09:09:18.133 に答える