但是Ext官方API手册中,Object主题,其中的prototype属性的说明是:Allows the addition of properties to all objects of type Object.
我试过,String、Array等其他对象都可以,唯独Object不行,比如Object.prototype.aaa = function(){var a=231;alert(a)}就这么简单的function加进去都会导致Ext整个崩溃……难道只允许添加“properties”,不允许添加“function”?

解决方案 »

  1.   


    如果不用Ext库的话,改个prototype都不算事……话说我嫌 Ext.JSON.encode(obj)太长,打算改成obj.toJson()所以这样写:
    Object.prototype.toJson = function(){return Ext.JSON.encode(this)}
    看上去是没问题,但是只要加上这玩意,我整个Ext项目,数层嵌套panel都不再显示,Chrome 只给了一条提示Uncaught TypeError: Cannot read property 'el' of undefined        ext-all-dev.js:168663这根本无从下手……
    之后又发现,只要往Object.prototype里面加function,就会出现同样的错误……
      

  2.   

    我想要的答案,有两种,出现其中一个即可:
    1.Ext库中的Object.prototype跟不用Ext时的Object.prototype有什么区别
    2.在使用Ext库时,怎样向Object.prototype中添加function
      

  3.   

    http://stackoverflow.com/questions/12254252/extjs-4-object-prototype-fail
      

  4.   

    不要随便扩展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
    xExt库中用for( in )的地方太多了。Ext又没有判断属性是不是继承原型的这样每个对象都多出个aaa来
    这不乱套了
      

  5.   

    我好多年没用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.add(a);a.pending=true}this.layoutQueue.add(a)
    add方法  add: function(c) {
            var b = this, a = b.getKey(c);   //这里 的c就是传进去的 1  getKey返回是 c.id 那么返回是 null
            if (!b.map[a]) {
                ++b.length;
                b.items.push(c);    //于是1 被加入了 布局对象队列
                b.map[a] = c
            }
            return c
        },ap[a] = c
            }然后 你懂的 在ext布局中 枚举队列元素时  这个 1 就被作为 元素操作 后面肯定出错了前面这么多废话 就是 告诉你 不要动  Object,prototype
    因为他的属性 所有的后续对象全部可以访问 特别是 把object作为 hastab枚举访问的时候