2013-03-21 113 views
0

如何在命名空間(作用域)內繼承對象變量?繼承命名空間javascript

var f2 = { 
    a: 'test' 
} 

f2.history = { 

    load: function(){ alert(this.a); } 

} 

// Turns out Undefined 
f2.history.load(); 

回答

1

f2.historyf2之間沒有聯繫。更一般地說,財產價值與其持有者之間沒有聯繫。

你可以這樣調用它:

f2.history.load.call(f2); 

或者你可以用一個工廠聲明你的對象:

var f2 = (function(){ 
    var self = { 
     a: 'test' 
    }; 
    self.history = { 
     load: function(){ alert(self.a); } 
    }; 
    return self; 
})(); 

這將使

f2.history.load(); 

另一個變化將讓你以更分離的方式定義子模塊:

var f2 = { 
    a: 'test' 
}; 
(function(f){ 
    f.history = { 
     load: function(){ alert(f.a); } 
    } 
})(f2); 

這最後一個結構的優點是,很容易在不同的文件中聲明子模塊。

+0

接縫非常複雜,可能我只是用原型鏈不知何故? – 2013-03-21 11:32:28

+0

@AdrianMcCool:你可以使'f2.history'繼承自'f2',但這對我來說幾乎沒有任何意義 – Bergi 2013-03-21 14:24:09

+0

模塊/子模塊和繼承是非常不同的概念。沒有實例化,繼承就沒有多大意義。 – 2013-03-21 14:25:14

1

使用命名空間f2而不是this

load: function(){ alert(f2.a); } 

工作


var f2 = { 
    a : 'test', 
    init: function(a) { 
     if (a) this.a = a; //set a, if a is defined 
    }, 
}; 
function history(a) { 
    function F() {}; 
    F.prototype = f2; 
    var f = new F(); 
    f.init(a); 
    load = function() { 
     alert(f.a); 
    } 
    return this; 
} 

var h1 = history(); 
h1.load(); //alerts "test" 

var h2 = history('history'); 
h2.load(); //alerts "history" 

//but now h1 also holds history 
h1.load(); 
+0

謝謝!但我想使它使用這個關鍵字面向對象... – 2013-03-21 11:31:22

+0

好的。但是,爲什麼你要「覆蓋」一個對象文字?只有一個f2(例子) – davidkonrad 2013-03-21 13:57:55