如何在命名空间(作用域)内继承对象变量?继承命名空间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