Как работает jQuery: я получаю «Не удается установить свойство xxx из undefined» при попытке выполнить аналогичный прототип? - PullRequest
3 голосов
/ 07 апреля 2011

Как JQuery обрабатывает проблему «Не удается установить свойство xxx неопределенного»? «Если у меня есть:

function Foo() {
   Foo.fn = Foo.prototype;
}

Тогда у меня есть файл JavaScript с расширением с этим кодом:

(function(foo) {
   foo.fn.myPlugin = function() {
       //return something here
   };
})(Foo);

Я получаю сообщение об ошибке «Невозможно установить свойство myPlugin of undefined». Довольно забавно, если я просто скопирую код плагина в FireBug или Chrome и запускаю его в консоли, он работает нормально, подключается и работает, как и ожидалось, как:

foo.myPlugin();

Я предполагаю, что моя проблема либо в том, что браузер загружает документ, либо в том факте, что мой существующий объект не находится внутри его собственного пространства имен.Вы определяете класс, используя синтаксис var ??

Я не знаю ... из того, что я понимаю ... либо должно работать.

Ответы [ 3 ]

1 голос
/ 07 апреля 2011

Из того, что я могу сказать, вы никогда не выполняете строку:

Foo.fn = Foo.prototype;

в вашей функции Foo().

Функции выполняются только при их вызове .

Попробуйте использовать шаблон синглтона:

var Foo = new function Foo() {
    this.fn = this.prototype;
};

В этом случае вы создаете экземпляр объекта Foo, вызывая оператор new для именованной анонимной функции Foo().

1 голос
/ 08 апреля 2011

Это не проблема для jQuery.В вашем коде есть, по крайней мере, одна проблема, как указано в другом ответе.

Если вы серьезно относитесь к пониманию этого, Джон Ресиг (первоначальный автор jQuery) составил отличный интерактивный учебник под названием Усовершенствованный Javascript .

1 голос
/ 07 апреля 2011
function Baz() {
   return this;
}
Baz.prototype.fn = Baz.prototype;
var Foo = new Baz();
Baz = null;
(function(Bar) {
   Bar.fn.myPlugin = function() {
       return "test";
   };
})(Foo);
Foo.myPlugin(); //returns test

Это работает и оставляет Baz назначаемым.Не уверен, так ли это делает jQuery.

...