FF JavaScript引擎私有属性全解
FF里面有不少让人爱不释手的私有属性和方法 它们没有被ECMAScript支持 但却非常好用 所有这些属性都是__XXXX__这种形式
在FF2.0 JS引擎SpiderMonkey1.7版本下可以使用的所有私有属性(这个应该是比较全的 我从源码里面找的)
JavaScript 1.0
__count__
表示一个对象的自身的属性个数 即hasOwnProperty为true的属性
var o={a:1,b:2};
alert(o.__count__);
alert(o.__count__);
__parent__
表示对象定义时所在的scopeChain 一般只有函数对象有用 而且会因为某些优化而不可预料
var o={a:1,b:2};
alert(o.__parent__);
alert(o.__parent__);
__proto__
表示对象的原型 即是原型链的指针
var o0={c:3}
var o={a:1,b:2};
alert(o.c);
o.__proto__=o0;
alert(o.c);
var o={a:1,b:2};
alert(o.c);
o.__proto__=o0;
alert(o.c);
__defineGetter__
函数 定义一个对象属性的getter 类似C#
var o={};
var a="Hello!";
o.__defineGetter__("a",function(){return a;});
alert(o.a);
a="Hi";
alert(o.a);
var a="Hello!";
o.__defineGetter__("a",function(){return a;});
alert(o.a);
a="Hi";
alert(o.a);
__defineSetter__
函数 定义一个对象属性的setter
var o={};
var a;
o.__defineSetter__("a",function(v){a=v;});
o.a="Hello!";
alert(a);
var a;
o.__defineSetter__("a",function(v){a=v;});
o.a="Hello!";
alert(a);
__lookupGetter__
查找某一getter是否存在
__lookupSetter__
查找某一setter是否存在
var o={};
o.__defineSetter__("a",function(v){a=v;});
alert(o.__lookupSetter__("a"));
o.__defineSetter__("a",function(v){a=v;});
alert(o.__lookupSetter__("a"));
JavaScript 1.5
__noSuchMethod__
当访问某一对象不存在的属性时的行为
var obj={};
obj.__noSuchMethod__ = function __noSuchMethod__ (id, args) {
alert(id);
}
obj.OOXX();
obj.XXOO();
obj.__noSuchMethod__ = function __noSuchMethod__ (id, args) {
alert(id);
}
obj.OOXX();
obj.XXOO();
JavaScript 1.7
__iterator__
Iterator对象使用的属性 可以改变for in之类的默认行为
var range={from:1,to:10};
range.__iterator__=function(){
return {
current:this.from,
to:this.to,
next:function(){
if(this.current>this.to)throw StopIteration;
return this.current++;
}
}
}
for(var i in range)
alert(i);
range.__iterator__=function(){
return {
current:this.from,
to:this.to,
next:function(){
if(this.current>this.to)throw StopIteration;
return this.current++;
}
}
}
for(var i in range)
alert(i);