ExtJS 4 Object.prototype fail

ExtJS 4 Object.prototype fail

本文关键字:fail prototype Object ExtJS      更新时间:2023-09-26

在使用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