jQuery $ .extend命名空间

时间:2014-11-10 00:24:05

标签: javascript jquery

如何使用嵌套命名空间扩展对象原型?

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();

2 个答案:

答案 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