Наследование пространства имен javascript
Как я могу наследовать переменные объектов в пространстве имен (области)?
var f2 = {
a: 'test'
}
f2.history = {
load: function(){ alert(this.a); }
}
// Turns out Undefined
f2.history.load();
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.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);
Преимущество этой последней конструкции состоит в том, что можно легко объявлять подмодули в разных файлах.