2015-05-24 79 views
0

我设法聚集一原型对象到的JavaScript普通对象:的jQuery与原型对象扩展对象

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

据我了解,当新建一个原型对象时,函数会绑定到用new创建的对象并传递给构造函数。

但与jQuery扩展,这个参数不是新的对象,但指向myMainObject,这使我困惑。

有什么想法吗?

+0

你可以在这里尝试一下,http://jsfiddle.net/5oyqq6qa/ – ZeroX

+0

我的实际意图是让ModuleA功能都有自己的范围而不混杂了与myMainObject属性。 – ZeroX

回答

1

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

没错。这就是this在JavaScript中的工作原理。该表达式:

myMainObject.funcA(); 

中查找funcA财产上myMainObject,取回一个函数的引用,然后调用该函数,调用该对象,它由(myMainObject)得到了功能过程中设置this。这是this分配的正常方式。

如果你想this别的东西,你可以用Function#bind创建一个函数与this烤成,或Function#callFunction#apply使用特定this值调用一个函数,但你可能不希望在您的方案中。

更多关于this(我的博客)


请回复您的评论:

我的实际意图是让ModuleA功能已经没有了混乱与myMainObject属性

自己的范围,那么请不要混乱ModuleAmyMainObject。听起来像是你想组成代替:

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

myMainObject.moda.funcA(); 
+0

哇,我不知道JavaScript做了不同于绑定函数 – ZeroX

+0

雅,组成是另一种方式。我的场景是让我的对象从PublishSubscribe对象继承,它将具有订阅和派发Event给所有订阅者的功能。组成要求客户代码知道在哪里可以找到该功能,哪个不太合适。 – ZeroX

0

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

属性是经由新MyCustomObject(参数)构造的对象,或内置的JavaScript类型,如日期或正则表达式,不重新构造和将显示为在所得到的对象平原对象或数组。

对于不属于此行为的需求,请改为编写自定义扩展方法,或者使用像lodash这样的库。