试图让对象识别其父对象,而不将父对象传递给子对象的实例

时间:2011-09-14 15:59:11

标签: javascript object child-objects

我在查找有关此问题的详细信息时遇到了麻烦。 我想在Foo()中实例化Bar()而不必传递指向Foo()的指针。或者某种方式让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;

感谢。

3 个答案:

答案 0 :(得分:2)

这不可能,因为JavaScript中没有内置的父/子逻辑。它们只是对象的引用。

<强>更新

对不起,我想我误解了你的问题。我前段时间也问了同样的问题: here。你要做的是在调用当前函数的函数中得到“this”这个对象。

答案是:你做不到......

但你可以使用范围来实现:

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并将参数值传递给它。您可以直接使用参数变量。

答案 1 :(得分: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/

答案 2 :(得分:0)

您需要为子对象提供以下内容之一:

  1. 从一个对象到另一个对象的直接指针,如示例代码中所示。
  2. 有关父对象的唯一信息,以便它可以通过其他方式间接确定父对象的内容。

    例如,您可以将Foo的所有实例存储在子bar对象可以搜索的全局注册表对象(对象文字或数组)中。它将寻找具有等于其自身的子bar的对象。 1 这样,它是Foo的子节点的事实是唯一标识符。当然,除非可以在多个bar之间共享一个foo。然后你被软管了。 :)


  3. 1:这样做的缺点是你要存储所有创建的Foo实例,这意味着它们永远不会被垃圾收集:你会泄漏内存,这可能是坏事如果你的环境坚持一段时间(例如node.js app)。