我在查找有关此问题的详细信息时遇到了麻烦。 我想在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;
感谢。
答案 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)
您需要为子对象提供以下内容之一:
有关父对象的唯一信息,以便它可以通过其他方式间接确定父对象的内容。
例如,您可以将Foo
的所有实例存储在子bar
对象可以搜索的全局注册表对象(对象文字或数组)中。它将寻找具有等于其自身的子bar
的对象。 1 这样,它是Foo
的子节点的事实是唯一标识符。当然,除非可以在多个bar
之间共享一个foo
。然后你被软管了。 :)
1:这样做的缺点是你要存储所有创建的Foo
实例,这意味着它们永远不会被垃圾收集:你会泄漏内存,这可能是坏事如果你的环境坚持一段时间(例如node.js app)。