【问题标题】:inheritance namespace javascript继承命名空间javascript
【发布时间】:2013-03-10 20:07:30
【问题描述】:

如何在命名空间(范围)内继承对象变量?

var f2 = {
   a: 'test'
}

f2.history = {

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

}

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

【问题讨论】:

    标签: javascript javascript-namespaces


    【解决方案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);
    

    最后一个结构的优点是很容易在不同的文件中声明子模块。

    【讨论】:

    • 接缝真的很复杂,我可以用原型链吗?
    • @AdrianMcCool:你可以让f2.history 继承自f2,但这对我来说几乎没有任何意义
    • 模块/子模块和继承是非常不同的概念。没有实例化,继承毫无意义。
    【解决方案2】:

    使用命名空间 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();
    

    【讨论】:

    • 好的。但是你为什么要“覆盖”一个对象字面量呢? f2只有一个(例子)
    猜你喜欢
    • 2013-03-03
    • 1970-01-01
    • 2013-08-13
    • 2017-12-10
    • 1970-01-01
    • 1970-01-01
    • 2011-08-18
    • 2013-12-30
    • 2017-09-27
    相关资源
    最近更新 更多