2

我很难找到有关此问题的详细信息。我想在 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;

谢谢。

4

3 回答 3

2

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

更新

哦,对不起,我想我误解了你的问题。前段时间我问过同样的问题: 这里。您要做的是在调用当前函数的函数中获取“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 并将参数值传递给它。您可以直接使用参数变量。

于 2011-09-14T16:06:11.693 回答
1

没有办法自动知道thisa 的调用者的指针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唯一标识符。当然,除非一个bar可以在多个foos 之间共享。那你就完蛋了。:)


1:这样做的缺点是您存储了Foo曾经创建的每个实例,这意味着它们永远不会被垃圾收集:您将泄漏内存,如果您的环境存在一段时间,这可能会很糟糕(例如node.js 应用程序)。

于 2011-09-14T16:16:51.490 回答