我尝试将原型对象聚合到 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
,这让我很困惑。
有什么想法吗?
答案 0 :(得分:1)
当我执行myMainObject.funcA时,这个参数实际上是myMainObject !!!
右。这就是this
在JavaScript中的作用。这个表达式:
myMainObject.funcA();
在funcA
上查找myMainObject
属性,获取函数引用,然后调用该函数,在调用它获取函数的对象期间设置this
( myMainObject
)。这是分配this
的正常方式。
如果您希望this
成为其他内容,可以使用Function#bind
创建一个包含this
的功能,或Function#call
或Function#apply
使用特定this
值调用函数,但在您的方案中您可能不想。
有关this
的更多信息(在我的博客上):
this
(我需要更新此内容以讨论ES6箭头功能) 重新评论:
我的目的是让ModuleA函数有自己的范围,而不会与myMainObject属性混淆
然后不要将ModuleA
混为myMainObject
。听起来你想要组成:
var myMainObject = {
list: [],
moda: new ModuleA()
};
myMainObject.moda.funcA();
答案 1 :(得分:0)
$.extend
不调用构造函数,它只复制对象的数据。来自documentation:
作为通过新的MyCustomObject(args)构建的对象的属性,或者内置的JavaScript类型(如Date或RegExp),不会重新构造,并且在生成的对象或数组中将显示为普通对象。
对于不属于此行为的需求,请编写自定义扩展方法,或使用lodash之类的库。