0

操作のために空の新しいオブジェクトを作成しようとすると、古いデータを取得できません。

これが私が試したものの例です:

function Foo() {
    this.Bar = Bar;
    // etc..
}

var Bar = {
    __words : {},
    addWord : function (word, amount) {
        this.__words[word] = amount;
    }
    // etc..
}

さて、新しいオブジェクトを作成すると:

var foo = new Foo();
var bar = foo.Bar;
bar.addWord("hello",7);
bar.addWord("world",9);

var lorem = new Foo();
var words = lorem.Bar.__words; // This will display {hello:7,world:9} from the
                               // previous object

私も使用してみましたが、前のオブジェクトのObject.create()を表示して同じでした。__words

4

3 に答える 3

4

によって参照されるオブジェクトは、各インスタンスBar間で共有されます。Foo

ロジックを 2 つのオブジェクトに配置する意味がよくわかりません。1 つのコンストラクター関数だけでこれを行うことができます。

function Foo() {
    this.__words = {};
}

Foo.prototype.addWord = function(word, amount) {
    this.__words[word] = amount;
}


var foo = new Foo();
foo.addWord("hello",7);

var bar = new Foo();
bar.addWord("world",9);

本当に機能を分離する必要がある場合は、コンストラクター関数も作成し、コンストラクター メソッドBar内に新しいインスタンスを作成します。Foo

function Foo() {
    this.bar = new Bar();
}


function Bar() {
    this.__words = {};
}

Bar.prototype.addWord = function(word, amount) {
    this.__words[word] = amount;
}
于 2013-06-09T21:01:49.970 に答える
0

古いデータを取り出せません。

var Bar実際にどちらがグローバルかを明確にしていません。つまり、新しいオブジェクトを作成していますがvar lorem = new Foo();、Foos コンストラクターで同じ Bar オブジェクトを彼に与えています。

this.Bar = Bar; 

新しいオブジェクトが必要な場合は、Foo に独自の Bar オブジェクトを指定する必要があります。または以下を含めます。

__words : {},
    addWord : function (word, amount) {
        this.__words[word] = amount;

Foo自体で。

とにかく、これが 1 回だけ必要な場合は、単に Bar の words 配列を空にすることができます。

于 2013-06-09T20:59:45.140 に答える
0

コードにはいくつかの問題があります。

function Foo() {
    this.Bar = Bar;
    // etc..
}

var Bar = {
    __words : {},
    addWord : function (word, amount) {
        this.__words[word] = amount;
    }
    // etc..
}

Bar は Foo の前に定義する必要がありますが、変数は実際には関数スコープ レベルで定義されているため、この特定の例では問題にならない可能性があるため、問題なく機能する可能性があります。

つまり、Foo コンストラクター内でオブジェクトをコピーしています。オブジェクトは可変であるため、機能しません。オブジェクトへの 1 つの変更により、もう 1 つの変更が行われます。あなたができるかもしれないことはこれです。new なしでそれを行う別の方法を次に示します。

var Bar = {
    create: function () {
       var obj = Object.create(this);
       obj.__words= {};
       return obj;
    },

    addWord: function (word, amount) {
       this.__words[word] = amount;
    }
    ...other methods...
};

var Foo = function () {
    this.Bar = Bar.create();
    // etc..
};

Object.createしかし、他のブラウザでどのようにサポートされているかわかりません。この構文は Felix が書いたものと同等であり、2 つのオブジェクトの必要性を明確に取り除くことができます。

唯一の大きな違いは、代わりに new Bar() を記述することです。実際にプロトタイプ オブジェクトを作成し、プロトタイプからオブジェクトを作成しています。create はコンストラクターです。

Foo も同じように書くことができ、次のようになります。

var Bar = {
    create: function () {
       var obj = Object.create(this);
       obj.__words= {};
       return obj;
    },

    addWord: function (word, amount) {
       this.__words[word] = amount;
    },
    ...other methods...
};

var Foo = {
    create: function () {
      var foo = Object.create(this);
      foo.Bar = Bar.create();
      return foo;
    },
    ....
};

var foo1 = Foo.create();
var foo2 = Foo.create();

foo1.bar.addWord("allo", 3);

それはすべて、あなたが何をしようとしているのかに依存すると思いますが、「新しい」演算子よりもいくつかの利点として create メソッドがあります。たとえば、オブジェクトの作成後にコールバックを実行する非同期メソッドを作成できます。

詳細については、こちらをご覧ください。結局のところ、それはほとんど同じことです。

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/create

于 2013-06-09T21:00:07.810 に答える