Ответ 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
.