2012-03-24 8 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を示していることを取得文字列はオブジェクトであるため、連結されたcapitalizeオブジェクトと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

関連する問題