jQuery使用Prototype对象扩展对象

时间:2015-05-24 08:59:56

标签: javascript jquery

我尝试将原型对象聚合到 JavaScript 普通对象:

var ModuleA = function( data ) {
    this.data = data;
};

ModuleA.prototype.funcA = function() {
    alert( JSON.stringify( this ) );
}

var myMainObject = { 
    list: []
};

$.extend( myMainObj <--------- ???ect, new ModuleA( 'Haha' ) );

myMainObject.funcA();

现在myMainObject将具有数据属性和funcA功能,因为我合并到myMainObject

当我执行myMainObject.funcA时,这个参数实际上是myMainObject

据我所知,当新建一个 Prototype 对象时,该函数将绑定到使用new创建的对象并传递给构造函数。

但是使用 jQuery 扩展,这个参数不是新对象,而是指向myMainObject,这让我很困惑。

有什么想法吗?

2 个答案:

答案 0 :(得分:1)

  

当我执行myMainObject.funcA时,这个参数实际上是myMainObject !!!

右。这就是this在JavaScript中的作用。这个表达式:

myMainObject.funcA();

funcA上查找myMainObject属性,获取函数引用,然后调用该函数,在调用它获取函数的对象期间设置thismyMainObject)。这是分配this的正常方式。

如果您希望this成为其他内容,可以使用Function#bind创建一个包含this的功能,或Function#callFunction#apply使用特定this值调用函数,但在您的方案中您可能不想

有关this 的更多信息(在我的博客上)

重新评论:

  

我的目的是让ModuleA函数有自己的范围,而不会与myMainObject属性混淆

然后不要将ModuleA混为myMainObject。听起来你想要组成

var myMainObject = { 
    list: [],
    moda: new ModuleA()
};

myMainObject.moda.funcA();

答案 1 :(得分:0)

$.extend不调用构造函数,它只复制对象的数据。来自documentation

  

作为通过新的MyCustomObject(args)构建的对象的属性,或者内置的JavaScript类型(如Date或RegExp),不会重新构造,并且在生成的对象或数组中将显示为普通对象。

     

对于不属于此行为的需求,请编写自定义扩展方法,或使用lodash之类的库。