2013-03-21 91 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