2

この問題に関する詳細情報を見つけるのに問題があります。Foo()へのポインタを渡さずにFoo()内でBar()をインスタンス化したいと思います。または、Bar()がFoo()の子であることを知るための何らかの方法。これは可能ですか?それとも私はすでに十分な方法を使用していますか?

基本的に、私は次のような呼び出しを避けようとしています。

var bar1 = new Bar(this,someValue);

以下に、現在使用している方法の大まかな例を示します。

function Bar(p,val) {
    var par = p,
        value = val;
    this.__defineGetter__("value", function() {
        return par.dun.value + value;
    });
}

function Dun(val) {
    var value = val;
    this.__defineGetter__("value", function() {
        return value;
    });
}

function Foo() {
    var dun = new Dun(15);
    var bar1 = new Bar(this, 10);
    var bar2 = new Bar(this, 20);
    this.__defineGetter__("dun", function() {
        return dun;
    });
    this.__defineGetter__("bar1", function() {
        return bar1;
    });
    this.__defineGetter__("bar2", function() {
        return bar2;
    });
}
var myFoo = new Foo();
myFoo.bar1.value;

ありがとう。

4

3 に答える 3

2

いいえ、JavaScript には組み込みの親子ロジックがないため、これは不可能です。それらは単なるオブジェクトへの参照です。

アップデート

申し訳ありませんが、私はあなたの質問を誤解したと思います。しばらく前に同じ質問をしたことがあります: here . あなたがやろうとしているのは、現在の関数を呼び出した関数で「これ」であるオブジェクトを取得することです。

答えは、あなたにはできない...

しかし、スコープを使用してそれを行うことができます:

function Dun(val) {
    var value = val;
    this.__defineGetter__("value", function() {
        return value;
    });
}

function Foo() {
    var dun = new Dun(15);
    var bar1 = new Bar(10);
    var bar2 = new Bar(20);
    this.__defineGetter__("dun", function() {
        return dun;
    });
    this.__defineGetter__("bar1", function() {
        return bar1;
    });
    this.__defineGetter__("bar2", function() {
        return bar2;
    });
    function Bar(val) {
        this.__defineGetter__("value", function() {
            return dun.value + val;
        });
    }
}
var myFoo = new Foo();
myFoo.bar1.value;

PS: あなたの質問とは関係ありませんが、知っておくと便利です:

function(val){}

と同じです

function(){
    var val = arguments[0];
}

新しい var を作成して引数の値を渡す必要はありません。引数変数を直接使用できます。

于 2011-09-14T16:06:11.693 に答える
1

thisの呼び出し元のポインタを自動的に知る方法はありませんnew。したがって、コンストラクターの一部として渡さずにこの値が何であるかを知りたい場合は、適切な情報を含むセミグローバル状態を設定する必要があります。次のようにできます。

function Bar(val) {
    var par = Bar.parent(),
        value = val;
    this.__defineGetter__("value", function() {
        return par.dun.value + value;
    });
}

// global methods and state on the Bar function
Bar.createContext = [];
Bar.push = function(o) {Bar.createContext.push(o);}
Bar.pop = function() {Bar.createContext.pop();}
Bar.parent = function() {return(Bar.createContext[Bar.createContext.length - 1]);}

function Dun(val) {
    var value = val;
    this.__defineGetter__("value", function() {
        return value;
    });
}

function Foo() {
    Bar.push(this);               // set global state
    var dun = new Dun(15);
    var bar1 = new Bar(10);       // don't need to pass "this" since it's in the global state
    var bar2 = new Bar(20);
    this.__defineGetter__("dun", function() {
        return dun;
    });
    this.__defineGetter__("bar1", function() {
        return bar1;
    });
    this.__defineGetter__("bar2", function() {
        return bar2;
    });
    Bar.pop();                    // restore global state
}
var myFoo = new Foo();
myFoo.bar1.value;

そして、ここで動作することがわかります: http://jsfiddle.net/jfriend00/wMgBL/

于 2011-09-14T16:37:09.483 に答える
0

子オブジェクトに次のいずれかを与える必要があります。

  1. コード例のように、あるオブジェクトから別のオブジェクトへの直接ポインター。

  2. 親オブジェクトに関する一意の情報。その親が何であるかを他の手段で間接的に判断できます。

    たとえば、すべてのインスタンスをFooグローバル レジストリ オブジェクト (オブジェクト リテラルまたは配列) に格納し、子barオブジェクトが検索できるようにすることができます。barそれ自体と等しい子を持つオブジェクトを探します。1このように、の子であることがFoo一意の識別子です。もちろん、1 つbarを複数fooの で共有できない場合を除きます。それからあなたはうんざりしています。:)


1: これの欠点は、Fooこれまでに作成された のすべてのインスタンスを格納することです。つまり、ガベージ コレクションが行われないことを意味します。メモリ リークが発生し、環境がしばらく固執すると問題になる可能性があります (たとえば、 node.js アプリ)。

于 2011-09-14T16:16:51.490 に答える