2012-03-24 59 views
1

我一直在玩JavaScript扩展其功能,但已经注意到我不想发生的一些行为。扩展JavaScript?

拿这个例子:

String.prototype.capitalize = function() 
{ 
    return this.replace(/(^|\s)([a-z])/g , function(m,p1,p2){ return p1+p2.toUpperCase(); }); 
}; 

Object.prototype.sizeof = function() 
{ 
    var counter = 0; 
    for(index in this) 
    { 
     console.info(index); 
     counter++; 
    } 

    return counter; 
}; 

var animals = {cow: 'moo', duck: 'quack'} 
animals.sizeof(); 

console.info(' '); 

var stirngs = "yay"; 
for(i in stirngs) console.info(i); 

时会产生输出:

code 
duck 
sizeof 

0 
1 
2 
capitalize 
sizeof 

我拿到打印出来的所有对象显示的sizeof,因为我只用字符串做一个对象,同样,因为一个字符串是一个对象,所以它获得了大写和sizeof对象的连接。

问题是为什么我看不到像toLowerCase这样的其他JavaScript对象,我假设它与通过原型进行扩展有关。无论如何不会让这些人出现这样的情况,这与我正在写的其他功能有关。

回答

3

toLowerCase方法的enumerable标志设置为false

您也可以使用Object.defineProperty定义这样的属性:
演示:http://jsfiddle.net/YGxP7/

Object.defineProperty(String.prototype, 'capitalize', { 
    value: function() { 
     return this.replace(/(^|\s)([a-z])/g , function(m,p1,p2){ return p1+p2.toUpperCase(); }); 
    }, 
    enumerable: false 
}); 
// Similarly, sizeof: 

Object.defineProperty(Object.prototype, 'sizeof', { 
    value: function() { 
     var counter = 0; 
     for(index in this) { 
      console.info(index); 
      counter++; 
     } 
     return counter; 
    }, 
    enumerable: false 
}); 
+0

好极了,谢谢! – Rob 2012-03-24 22:37:15