但是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”?
我试过,String、Array等其他对象都可以,唯独Object不行,比如Object.prototype.aaa = function(){var a=231;alert(a)}就这么简单的function加进去都会导致Ext整个崩溃……难道只允许添加“properties”,不允许添加“function”?
解决方案 »
- 正则表达式匹配的问题
- 呼叫大虾,九宫锁屏问题
- 如何 遍历标签 找出匹配的一项
- 大家喜欢用javascript还是jquery???
- 梅花雪(tree)单选框选不中的问题,请高手赐教,分不多,拜谢!
- firefox中取消单元格背景色
- html 中的slider
- 有谁能给我解释一下<script id="xxx"></script>,id有什么用,怎么解释?
- 照片添加删除
- a < 5 && a > 5 ? console.log(true) : console.log(false); 问 a为何值时 , 打印true
- IE6下window.event获取不到的问题
- 求学好jquery的基础是什么?快要学了《→大神们_求答案
如果不用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,就会出现同样的错误……
1.Ext库中的Object.prototype跟不用Ext时的Object.prototype有什么区别
2.在使用Ext库时,怎样向Object.prototype中添加function
在用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来
这不乱套了
但是我觉得调试就可以找到问题打开 任意的 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枚举访问的时候