2011-09-14 30 views
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; 

謝謝。

回答

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]; 
} 

您不必創建一個新的變量並將參數值傳遞給它。您可以直接使用參數變量。

+0

所以,我應該只是堅持我現在做的方式? :) – Duncan

+0

是的,要麼是,要麼你在Foo中定義Bar,然後使用該範圍來訪問它。 –

+0

@Duncan,我已經向你展示了另一種方式來實現我的新答案(我不確定是否比將this'傳遞給構造函數更好),但這是另一種選擇。 – jfriend00

0

你需要給孩子對象執行下列操作之一:

  1. 從一個對象直接指向另一個,如您的示例代碼。
  2. 有關父對象的唯一信息,以便它可以通過其他方式間接確定該父對象的內容。

    例如,您可以將Foo的所有實例存儲在子對象bar可以搜索的全局註冊表對象(對象文字或數組)中。它將查找具有與其自身相同的子對象bar。 以這種方式,它是Foo的子項的事實是唯一標識符。當然,除非可以在多個foo之間共享一個bar。然後你被洗淨了。:)


1:這樣做的缺點是,你存儲有史以來的Foo每個實例,這意味着他們將永遠不會被垃圾收集:你會泄漏內存,這如果您的環境存在一段時間(如node.js應用程序),可能會很糟糕。

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/