jQuery扩展对象与原型对象

jQuery extend object with Prototype object

本文关键字:对象 原型 jQuery 扩展      更新时间:2023-09-26

我尝试将Prototype对象聚合为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时,this参数实际上是myMainObject !

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

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

有什么想法吗?

当我执行myMainObject。funcA, this参数实际上是myMainObject !!

。这就是this在JavaScript中的工作方式。这个表达式:

myMainObject.funcA();

myMainObject上查找funcA属性,返回一个函数引用,然后调用该函数,在调用过程中设置this到它从中获得函数的对象(myMainObject)。这是this的正常分配方式。

如果你想让this成为别的东西,你可以使用Function#bind来创建一个包含this的函数,或者使用Function#callFunction#apply来调用一个使用特定this值的函数,但是你可能不想在你的场景中使用

更多关于this 的信息:

    <
  • 神话方法/em>
  • 你必须记住this (我需要更新这个来谈论ES6箭头函数)

你的评论:

我的实际意图是让ModuleA函数有自己的作用域,而不会与myMainObject属性混淆

那么不要把ModuleA混在myMainObject中。听起来你想要composition而不是

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

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

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

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