如何使用嵌套命名空间扩展对象原型?
http://jsfiddle.net/2t5314nu/2/
我希望能够从Obj.prototype
this.nested.method
调用嵌套方法,并能够nested
作为this.prop
访问原型属性和方法。
但是,当我使用jQuery $.extend
时,来自init
的{{1}}方法会覆盖nested
中的Obj.prototype
方法。事实上,永远不会调用Obj.prototype.init
。
我希望避免使用Obj.prototype.init
覆盖nested.init
。我可以使用$.extend
以外的其他内容。
function Obj() {
this.prop = 'val';
this.init();
}
Obj.prototype = {
init: function() {
console.log('object init');
console.log('prop in object init: ' + this.prop);
$('#object-init').text('object init');
this.nested.init();
this.nested.method();
}
};
var nested = {
init: function() {
console.log('nested init');
console.log('prop in nested init: ' + this.prop);
$('#nested-init').text('nested init');
},
method: function() {
console.log('nested method');
console.log('prop in nested method: ' + this.prop);
$('#nested-method').text('nested method');
}
};
$.extend(true, Obj.prototype, nested);
new Obj();
答案 0 :(得分:0)
this.nested在您发布的代码中未定义。当你调用extend时,给嵌套对象一个名字,这样它就会被添加到一个特定的位置而不是覆盖:
$ .extend(true,Obj.prototype,{nested:nested})
答案 1 :(得分:-1)
您可能不知道JavaScript中的this
是什么,它是调用对象,因此this
是方法之前的对象:
peter.doSomothing();//this in doSomething is peter
peter.nested.doSomething();//this in doSomething is nested
new Person();//when new is used this is the Person instance to be created
在调用嵌套方法时,可以使用.call或.apply来定义调用对象(如注释中所述)。
function Obj() {
this.prop = 'val';
this.init();
}
Obj.prototype = {
init: function() {
console.log('in Obj.prototype.init: ' + this.prop);
nested.init.call(this);
nested.method.call(this);
}
};
var nested = {
init: function() {
console.log('nested init');
console.log('prop in nested init: ' + this.prop);
},
method: function() {
console.log('nested method');
console.log('prop in nested method: ' + this.prop);
}
};
var o = new Obj();
或者你可以让一个Obj实例有一个Nested实例,它引用了Obj:
var Nested = function Nested(objInstance){
this.objInstance = objInstance;
};
Nested.prototype.init = function init(){
console.log('init in nested',this.objInstance);
this.method();
};
Nested.prototype.method = function method(){
console.log('method in nested',this.objInstance);
};
var Obj = function Obj(){
this.nested = new Nested(this);
this.prop='prop of Obj';
};
Obj.prototype.init = function init(){
console.log('init in Obj',this);
this.nested = new Nested(this);
};
var objInstance = new Obj();
objInstance.init();
objInstance.nested.init();
有关构造函数和原型的更多信息,请访问:https://stackoverflow.com/a/16063711/1641941