2014-11-05 4 views
2

При экспериментировании с методом создания частных статических методов я натолкнулся на это очень странное поведение. В следующем коде публичный метод getData перезаписывается собственными данными возврата, хотя он никогда не называется явным образом! Это очень странно для меня и задумался над тем, что здесь происходит. Полагаю, это служит мне для того, чтобы не просто охватить всю страницу в анонимной функции в соответствии с шаблоном модуля, но я все равно хотел бы понять эту ошибку.Расширение прототипа в анонимной функции - странные эффекты

function MyClass() { 
    this._prop = true; 
} 
MyClass.prototype.getData = function() { 
    this._prop = false; 
    return { a: 2344, b: 765, c: 234 }; 
} 

(function() { 
    var privateStatic = 0; 
    MyClass.prototype.getCount = function() { 
     return privateStatic++; 
    } 
}()); 

var m = new MyClass(); 
console.log(m.getData()); //Error (object is not a function) 
console.log(m.getData); //prints {a:2344,b:765,c:234} 
+2

вам нужно полу (;) после назначения метода getData; это выражение. в противном случае функция передается результат вашего анона, и результат этого присваивается экземпляру.getData – dandavis

ответ

0

Причина такого странного поведения является то, что в настоящее время GetData немедленно вызывается из-за отсутствия запятой после объявления функции (большое пятно, dandavis) и IIFE сразу после него, завернутый в круглых скобках. По существу, это:

MyClass.prototype.getData = function() { 
    this._prop = false; 
    return { a: 2344, b: 765, c: 234 }; 
} // Notice no semicolon here! 
(function() { 
    var privateStatic = 0; 
    MyClass.prototype.getCount = function() { 
    return privateStatic++; 
    } 
}()); 

Становится это:

MyClass.prototype.getData = function() { 
    this._prop = false; 
    return { a: 2344, b: 765, c: 234 }; 
}(); 

Какой поэтому установка свойства GetData для возвращаемого значения функции. Следовательно, почему m.getData распечатывает { a: 2344, b: 765, c: 234 } и m.getData() не работает (это уже не функция!).

+0

. Дополнительные точки с запятой в Javascript снова наступают! Спасибо jayrobin и dandavis за объяснение того, что казалось самым темным из черных магов. – wedstrom

Смежные вопросы