jQuery扩展对象与原型对象
jQuery extend object with Prototype object
我尝试将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#call
或Function#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之类的库。
- 重载JS'firefox中的对象原型
- 带有对象/原型的链式承诺(Q延期)
- 别名或以其他方式合并两个具有不同名称的相同对象原型
- 创建后指定对象原型
- javascript对象原型与jquery冲突
- 为什么我要将函数添加到对象原型中,而不是将其添加到对象中
- 基本对象/原型语法问题
- Javascript对象/原型.我的理解错了吗
- ES6 const,用于在JavaScript中创建对象原型;这是一种模式吗
- 在角度表达式中使用对象原型
- 对象原型和继承
- 为什么javascript对象原型被称为“fn”
- Uncaught TypeError:对象原型在Symfony 2中只能是Object或ExtJS为null
- 在Javascript中将对象原型函数绑定到对象
- 对象原型在Canvas Game中不起作用
- 如何获取Javascript对象原型的属性
- 为对象原型提供一个方法,该方法指向对象自身属性的值
- 向对象原型添加命名空间方法
- 在Vanilla Javascript中使用窗体中的对象原型创建多个用户
- Javascript对象原型错误