如何在命名空間(作用域)內繼承對象變量?繼承命名空間javascript
var f2 = {
a: 'test'
}
f2.history = {
load: function(){ alert(this.a); }
}
// Turns out Undefined
f2.history.load();
如何在命名空間(作用域)內繼承對象變量?繼承命名空間javascript
var f2 = {
a: 'test'
}
f2.history = {
load: function(){ alert(this.a); }
}
// Turns out Undefined
f2.history.load();
有f2.history
和f2
之間沒有聯繫。更一般地說,財產價值與其持有者之間沒有聯繫。
你可以這樣調用它:
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);
這最後一個結構的優點是,很容易在不同的文件中聲明子模塊。
使用命名空間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();
謝謝!但我想使它使用這個關鍵字面向對象... – 2013-03-21 11:31:22
好的。但是,爲什麼你要「覆蓋」一個對象文字?只有一個f2(例子) – davidkonrad 2013-03-21 13:57:55
接縫非常複雜,可能我只是用原型鏈不知何故? – 2013-03-21 11:32:28
@AdrianMcCool:你可以使'f2.history'繼承自'f2',但這對我來說幾乎沒有任何意義 – Bergi 2013-03-21 14:24:09
模塊/子模塊和繼承是非常不同的概念。沒有實例化,繼承就沒有多大意義。 – 2013-03-21 14:25:14