Подтвердить что ты не робот

Что означает прототип здесь в исходном коде jQuery?

В качестве примера скопирован из jQuery 1.2.6:

jQuery.fn = jQuery.prototype = {
    init: function( selector, context ) {
        // Make sure that a selection was provided
        selector = selector || document;
        ..........
    },
};

Я прочитал несколько сообщений здесь, например JavaScript: что такое .extend и .prototype, используемые для?, и знать, что прототип может использоваться в подклассе для расширения некоторых методов.

Но я не могу понять использование в приведенном выше фрагменте из jQuery.

Существуют ли канонические документы, описывающие прототип?

Спасибо.

4b9b3361

Ответ 1

Все объекты имеют свойство prototype. Это просто объект, из которого другие объекты могут наследовать свойства. Опубликованный фрагмент просто присваивает объект с некоторыми свойствами (например, init) в prototype of jQuery и псевдонимами jQuery.prototype до jQuery.fn, потому что fn короче и быстрее вводится. Если вы временно забудете о jQuery, рассмотрите этот простой пример:

function Person(name) {
    this.name = name;
}
Person.prototype.sayHello = function () {
    alert(this.name + " says hello");
};

var james = new Person("James");
james.sayHello(); // Alerts "James says hello"

В этом примере Person - это функция-конструктор. Его можно создать, вызвав его оператором new. Внутри конструктора ключевое слово this относится к экземпляру, поэтому каждый экземпляр имеет свое собственное свойство name.

prototype Person разделяется между всеми экземплярами. Таким образом, все экземпляры Person имеют метод sayHello, который они наследуют от Person.prototype. Определив метод sayHello как свойство Person.prototype, мы сохраняем память. Мы могли бы так же легко предоставить каждому экземпляру Person свою собственную копию метода (путем назначения его this.sayHello внутри конструктора), но это не так эффективно.

В jQuery, когда вы вызываете метод $, вы действительно создаете экземпляр jQuery.prototype.init (помните, что jQuery.fn === jQuery.prototype):

return new jQuery.fn.init(selector, context, rootjQuery);

И если вы посмотрите jQuery.fn.init:

jQuery.fn.init.prototype = jQuery.fn;

Итак, вы создаете экземпляр jQuery, который имеет доступ ко всем методам, объявленным в jQuery.prototype. Как обсуждалось ранее, это намного эффективнее, чем объявлять эти методы для каждого экземпляра jQuery.