代码改变世界

Mozilla JavaScript 扩展: __count__()

2009-03-02 11:46  wlstyle  阅读(533)  评论(1)    收藏  举报

 

翻译:Nicholas C. Zakas大牛博客的文章。Nicholas C. Zakas大牛版权所有。

Mozilla的javascript引擎支持额外的非标准属性,这样就给开发者提供了额外的属性和方法。上一个星期,我讨论_noSuchMethod_()这个能用户对象的方法。这个星期,这个主题是_count_属性,这一属性存在于所有用户默认定义的对象中同时这个属性代表这个对象中包含的属性和方法数。这一属性不能被重写也不能通过delete操作符移除这个属性。因为他有特别的作用。

 更特别的是,这个_count_属性总是影响对象的实例成员数。每一次当你为对象添加一个属性或者方法,_count_属性就进行了一次更新。无论何时你使用delete方法移除一个属性或者方法。_count_属性也进行了一次更新。

举个例子:

 

//Works in Mozilla JavaScript engines only!
var person = {
    name: "Nicholas"
};
 
alert(person.__count__);    //1
 
person.hair = "brown";
alert(person.__count__);    //2
 
delete person.name;
alert(person.__count__);    //1
在这个例子中,创建了一个只有一个属性name的对象person。所以开始的_count_的值是一。当添加了hair属性。_count_属性自动增加到2.同样的,删除name属性导致_count_属性重置为1.所有的这些都是自动发生的就象对象的处理。

   关于_count_重要的需要明了的事情是他只处理对象的实例成员所以他不计算经由原型继承得到的属性和方法。在非Mozilla JavaScript引擎中,你需要写一个循环同时使用hasOwnProperty()这个方法构建如此一个计数方法。

//all browsers

function getPropertyCount(object){

    var count=0,

        property;

    for (property in object){

        if (object.hasOwnProperty(property)){

            count++;

        }

    }

    return count;

}

很明显,使用__count__远远比创建一个循环以便计算对象的实例成员有效。

所以问题依然存在。为何这个属性对于知道对象的实例成员很有用?这个属性当你在做某种过程之前希望能知道一个对象是否只有继承的成员很有用。

if(getPropertyCount(object) > 0){

    //do something

}

这个类型的构造在区别由实例成员构建的对象和由单独的继承成员构建的对象很有用。比如,Json的序列化,大大 减少实例成员的数量(意译,汗)。

_count_属性在 javascript的世界中真的没有做很多的工作。但是他提供了很多在表现之后的回调信息(意译,汗)。这个扩展没有被非Mozilla核心的浏览器支持。所以不推荐在跨浏览器的开发中使用。

网吧键盘太难打字了.以后再做小修改

原文连接:http://www.nczonline.net/blog/2009/02/24/mozilla-javascript-extension-count/