2012-03-24 79 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