试图让一个对象识别它的父对象,而不把父对象传递给子对象的实例
Trying to get an object to identify its parent object without passing the parent into the child's instance
我很难找到关于这个问题的详细信息。我想在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;
谢谢。
不,这是不可能的,因为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];
}
你不需要创建一个新的变量并将参数值传递给它。您可以直接使用参数变量
无法自动知道new
调用方的this
指针。因此,如果您想知道这个值是什么,而不将其作为构造函数的一部分传递,那么您必须设置一些包含适当信息的半全局状态。你可以这样做:
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/
您需要为子对象指定以下内容之一:
-
从一个对象指向另一个对象的直接指针,如示例代码中所示。
-
关于父对象的唯一信息,这样它可以通过其他方式间接地确定父对象是什么。
例如,您可以将
Foo
的所有实例存储在全局注册表对象中(对象字量或数组),子bar
对象可以搜索它。它会寻找有一个子bar
等于自己的对象。1这样,它是Foo
的子节点这一事实就是唯一标识符。当然,除非一个bar
可以被多个foo
共享。然后你就完蛋了。:)
1:这样做的缺点是你存储了所有创建的Foo
实例,这意味着它们永远不会被垃圾收集:你将会泄漏内存,如果你的环境持续一段时间(例如node.js应用程序),这可能会很糟糕。
- 代码挑战:创建一个跟踪对象实例总数的类Foo
- 为什么属性存在于对象实例上,即使其原型发生了更改
- 如何在angularJS中获得对指令对象实例的引用
- 是否有将基于字符串的JSON转换为Mongoose Schema对象实例的本地功能
- 从对象实例中获取变量名称
- 了解 JavaScript 对象实例或工作流
- Javascript:在对象实例方法上使用apply()方法失败
- 多个对象实例发生干扰
- 确定javascript对象实例的类型
- 如何在Javascript中创建多个对象实例
- 在每个循环中创建对象实例
- javascript多个对象实例的时间戳相同
- 使用lodash'扩展JS对象实例;s的extend方法会导致奇怪的结果
- 避免在外部称为原型方法中丢失对象实例
- 不定义类的对象实例
- 对象实例中的方法不执行
- 像PHP一样使用json数组“水合”Javascript对象实例
- Javascript:父/子对象实例化的顺序
- 在 Angular.js 中跨应用程序使用相同的对象实例
- 对象引用未设置为 C# 中的对象实例