继承命名空间javascript

继承命名空间javascript,javascript,javascript-namespaces,Javascript,Javascript Namespaces,如何在命名空间(作用域)中继承对象变量 f2.history和f2之间没有链接。更一般地说,财产价值与其持有人之间没有联系 你可以这样称呼它: f2.history.load.call(f2); 或者您可以使用工厂声明您的对象: var f2 = (function(){ var self = { a: 'test' }; self.history = { load: function(){ alert(self.a); } };

如何在命名空间(作用域)中继承对象变量


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); }
工作



接缝真的很复杂,我能不能以某种方式使用原型链?@AdrianMcCool:你可以让
f2。历史
继承自
f2
,但这对备忘录/子模块来说几乎没有任何意义,继承是非常不同的概念。如果没有实例化,继承就没有什么意义。但为什么要“覆盖”对象文字?只有一个f2(示例)
 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();