试图让一个对象识别它的父对象,而不把父对象传递给子对象的实例

Trying to get an object to identify its parent object without passing the parent into the child's instance

本文关键字:对象 实例 一个对象 识别      更新时间:2023-09-26

我很难找到关于这个问题的详细信息。我想在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/

您需要为子对象指定以下内容之一:

  1. 从一个对象指向另一个对象的直接指针,如示例代码中所示。

  2. 关于父对象的唯一信息,这样它可以通过其他方式间接地确定父对象是什么。

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


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