0

在使用时使用原型有点问题framework ExtJS version 4.1.1.

起初,我在加载 ExtJS 之前制作了原型。"Array.prototype.xyz" and "String.prototype.xyz"一切正常。Bot"Object.prototype.xyz"在 mixin 包含ExtJS. 示例我的测试代码:

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'”,它可以正常工作。- 不。我目前不使用其他 mixins。- 是的。我尝试只使用一个虚拟面板组件。

问题:在 Object 类对象上原型有一个简单的解决方案吗?

4

1 回答 1

0

问题源于 Ext JS 库的基本方法之一: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(or Ext.apply) 使用对象文字调用时,您的原型方法都会在原型链上“提升”。当您创建面板(或任何组件,实际上)时,类mixin对象将与其原型mixin对象合并。由于 mixin 在类定义中被定义为对象字面量,因此您的“doSomething”方法会被提升。

然后在 中Ext.util.ElementContainer#getClassChildElsmixin假设每个属性都是一个现有的类并尝试访问该对象mixins[name].self.$childElsmixins[name]您的“doSomething”方法在哪里)。您的方法没有self属性,因此访问$childEls会引发错误。

如果您需要每个对象都可用的对象,请将其编写为静态方法,Object.doSomething例如Ext.Object.doSomething.

于 2012-09-06T23:50:07.567 回答