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);