日期:2014-05-16  浏览次数:20315 次

发现一个大问题:改动Object.prototype之后Ext整个就完了!
如题,往Object.prototype中增加function的话,Ext代码就不能正常运行了……

谁知道为什么,怎么解决
------解决方案--------------------
你加了什么  不要扩展自带的对象
------解决方案--------------------
应该没这么神奇吧。既然敢该,就该知道在那要注意。
------解决方案--------------------
http://stackoverflow.com/questions/12254252/extjs-4-object-prototype-fail


------解决方案--------------------
引用:
我想要的答案,有两种,出现其中一个即可:
1.Ext库中的Object.prototype跟不用Ext时的Object.prototype有什么区别
2.在使用Ext库时,怎样向Object.prototype中添加function
不要随便扩展js的系统对象的prototype。这是对js系统的污染。 
在用for( in )遍历时,这些扩展的属性也会一起遍历出来

<script type="text/javascript">
Object.prototype.aaa=111;
var d = {z:98,x:56};
for (var i in d)
document.write(i+"<br />");
</script>
输出
aaa
z
x

Ext库中用for( in )的地方太多了。Ext又没有判断属性是不是继承原型的

这样每个对象都多出个aaa来
这不乱套了

------解决方案--------------------
我好多年没用exjjs了
但是我觉得调试就可以找到问题

打开 任意的 extjs网站
在控制台里输入  Object.prototype.kk = 1
然后点一个ext中的窗口 真的报错 exj.all.js  65026行
然后 定位 报错的行  调试

getCmp: function(a) {
        return this.getItem(a, a.el)
    }

该位置报错   因为 a 为 null  那么 a.el 访问是异常
在往上看

runLayout: function(b) {
        var a = this, c = a.getCmp(b.owner);
这个时候b的值 为  1 那么基本肯定   b 来自于  Object.prototype.kk = 1

那么 基本目标找到
检查到 当前访问对象是  来自于 Ext.util.Queue
这是一个队列么 
现在就要找出 那个地方把 prototype下面的属性放进了数组里

,,,省略过程(这个过程就是 体力活呵呵)

在布局触发事件中  

fireTriggers: function(b, g) {
        var h = this[b], d = h && h[g], c = this.context, e, a;
        if (d) {
            for (a in d) {
                e = d[a];
                ++e.firedTriggers;
                if (!e.done && !e.blockCount && !e.pending) {
                    c.queueLayout(e)
                }
            }

这里要枚举所有的事件对象的属性 但是该对象
也就是d   控制台打印
d.constructor
function Object() { [native code] }

也就是d的属性是继承于Object 所以 一开始我设置的 Object.kk被枚举出来了
那么
相当于调用c.queueLayout(1)
c.queueLayout
function (a){this.layoutQueue.