1

「カウンター」プロパティがすべての新しいインスタンスでリセットされるように見える理由を理解するのを手伝ってくれる人はいますか? インスタンス化されたすべてのオブジェクトで共有される「文字」プロパティのように機能することを期待していました。

静的にすることを意図していない限り、プロトタイプ プロパティをこのように使用してはならない理由について、いくつかのサンプル コードをまとめているときに、これに遭遇しました。

サンプルコード:

var Dog = function() {
    this.initialize.apply(this, arguments);
};
Dog.prototype = {
    counter : 2,
    letters : [ 'a', 'b', 'c' ],
    initialize : function(dogName) {
        this.dogName = dogName;
    },
    add : function(amount) {
        this.counter += amount;
    },
    arr : function(char) {
        this.letters.push(char);
    }
};

var fido = new Dog("fido");
fido.add(1);
fido.arr('d');
console.log(fido.counter); // 3, as expected
console.log(fido.letters.toString()); // ABCD, as expected

var maxx = new Dog("maxx");
maxx.add(1);
maxx.arr('e');
console.log(maxx.counter); // 3, Unexpected, Why isn't this 4?
console.log(maxx.letters.toString()); // ABCDE, as expected
4

2 に答える 2

3

これはラインによるものです

this.counter += amount;

何が起こるのですか?インスタンスにプロパティカウンターthis.counterが見つからないので、プロトタイプから取得しますが、設定に関しては、インスタンスに設定します

var fido = new Dog("fido");
console.log(fido.hasOwnProperty('counter')); // false
fido.add(1);
console.log(fido.hasOwnProperty('counter')); // true

の省略形であることを覚えておいてください

this.counter = this.counter + amount;
/*    ↑              ↑
   instance          |
                 prototype */

lettersに関しては、プロトタイプpushObjectで発生しているため、期待どおりに機能しています-新しいインスタンス変数を設定していません。インスタンス変数を設定していた場合、オブジェクトは参照によって変数に割り当てられるため、引き続き機能する可能性があります。

var a = {}, b = a;
b.foo = 'bar';
a.foo; // "bar";
于 2013-09-20T19:28:04.713 に答える
0

で言うとthis.counter += amountadd呼び出されたオブジェクト (この場合は fido または maxx)thisを指します。addこの場合、 += 演算子は継承された値から読み取ります。これは、ローカル値がないためでありcounter、新しいローカル値に書き込みます。fido または maxx には独自のカウンター プロパティがあるため、プロトタイプは隠蔽されています。次のことを試してください。

Dog.prototype = {

    ...

    add : function(amount) {
        Dog.prototype.counter += amount;
    },

    ...

};
于 2013-09-20T19:27:59.043 に答える