ExtJS 4 Object.prototype fail
ExtJS 4 Object.prototype fail
在使用framework ExtJS version 4.1.1.
时使用原型有点问题
起初,我在加载ExtJS之前进行了原型设计。在"Array.prototype.xyz" and "String.prototype.xyz"
上,一切正常。在CCD_ 3上,CCD_。示例我的测试代码:
Object.prototype.doSomething = function() {
console.log('I do it!');
}
var a = {};
a.doSomething();
来自ExtJS的错误消息:
Uncaught TypeError: Cannot read property '$childEls' of undefined
And break.
以及:-是的。如果没有"Uncaught TypeError
:无法读取未定义的属性'$childEls'",它就可以工作好的-不。我目前不使用oter mixins。-是的。我尝试只使用一个虚拟面板组件。
问题:对于Object类对象上的原型,有一个简单的解决方案吗?
问题源于ExtJS库的一个基本方法:Ext.merge
证明这一点很简单:
Object.prototype.doSomething = function(){ console.log("Does something"); };
var emptyObj = {};
console.log(emptyObj.hasOwnProperty("doSomething")); // Prints "false"
var mergeObj = Ext.merge({}, {a: "b"});
console.log(mergeObj.hasOwnProperty("doSomething")); // Prints "true"
基本上,每次用对象文字调用Ext.merge
(或Ext.apply
)时,原型方法都会在原型链上"升级"。当您去创建一个面板(或者任何组件,实际上)时,类mixin
对象将与其原型的mixin
对象合并。由于mixin在类定义中被定义为对象文字,因此您的"doSomething"方法得到了提升。
然后在Ext.util.ElementContainer#getClassChildEls
中,mixin
对象被迭代,假设每个属性都是一个现有的类,并尝试访问mixins[name].self.$childEls
(其中mixins[name]
是您的"doSomething"方法)。您的方法没有self
属性,因此访问$childEls
会引发错误。
如果您需要在每个对象上都有一个可用的对象,请将其写成一个静态方法,如Object.doSomething
甚至Ext.Object.doSomething
。
- 直接在函数声明上使用function.prototype.bind
- 如何迭代Array.prototype函数
- Object.prototype using 'this'
- 在不兼容的接收器上调用的方法Set.prototype.add未定义
- 为什么可以't我用Set对象调用Array.prototype.map
- ExtJS 4 Object.prototype fail
- 如何通过Prototype或jquery移除子类的父类基类
- 复选框:使用Array.prototype.forEach调用推送选中订单,
- 将setTimeout()包装器实现为Element.prototype中的方法
- Object.prototype.hasOwnProperty.call() vs Object.prototype.h
- 如何通过 Function.prototype.apply() 更改调用函数的参数
- Function.prototype.call和Function.protoype.all只应用一个参数
- 使用JavaScript或Prototype获取表单中的所有控件并启用它们
- JavaScript-使用B.prototype=new A()继承数组
- 转换类似数组的对象Array.prototype.slice或Array.from
- requestAnimationFrame的Function.prototype.bind导致属性不可读
- jquery post.fail,即使php成功
- JavaScript - String.newProperty vs. String.prototype.newProp
- 如何将参数应用于String.prototype.format函数
- 为什么要将Array.prototype.slice.call与参数一起使用