Расширяете JavaScript? - PullRequest
       16

Расширяете JavaScript?

1 голос
/ 25 марта 2012

Я поиграл с 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.

Вопрос в том, почему я не вижу другие объекты JavaScript, такие как toLowerCase, я предполагаю, что это как-то связано с расширением через прототип. В любом случае, чтобы эти парни не появлялись таким образом, это мешает другим функциям, которые я пишу.

1 Ответ

3 голосов
/ 25 марта 2012

Для метода 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
});
...