Эта проблема связана с тем, что вы или используемая вами библиотека добавляете функции к Object.prototype .
Таким образом, этот код:
Object.prototype.foo = function() {};
Object.prototype.bar = function() {};
var myObj = { x: 1 };
for (var i in myObj) {
console.log(i)
}
напечатает: x, foo, bar (не обязательно в таком порядке), а не только x как выОжидайте.
В вашем случае это происходит в manager.js:
// initialize the socket for all namespaces
for (var i in this.namespaces) {
var socket = this.namespaces[i].socket(data.id, true);
// echo back connect packet and fire connection event
if (i === '') {
this.namespaces[i].handlePacket(data.id, { type: 'connect' });
}
}
Этот код не ожидает, что встретится с объявленным ключом: extension , как вы можетепосмотрите из трассировки стека ошибки:
TypeError: Object function extend(another) {
var properties = Object.keys(another);
var object = this;
properties.forEach(function (property) {
object[property] = another[property];
});
return object;
} has no method 'socket'
программа фактически пытается вызвать socket () в extension функция.
См. Разговор Боба здесь о добавлении функций в Object.prototype .
Что касается решения, вы можете добавить условный оператор в менеджере.js вот так:
// initialize the socket for all namespaces
for (var i in this.namespaces) {
if ('extend' == i) continue; // ADDED
var socket = this.namespaces[i].socket(data.id, true);
// echo back connect packet and fire connection event
if (i === '') {
this.namespaces[i].handlePacket(data.id, { type: 'connect' });
}
}
или вы можете удалить Object.prototype.extend = function (...) {} объявление, которое является моимличные предпочтения.