Показать сообщение отдельно
  #15 (permalink)  
Старый 19.01.2010, 22:27
Отправить личное сообщение для Octane Посмотреть профиль Найти все сообщения от Octane  
Регистрация: 10.07.2008
Сообщений: 3,873

Сообщение от mycoding
Так если глянуть ничего сложного, хотя не совсем пока понимаю вот эту строчку
$.any.prototype = $.prototype = {constructor: $};
Ну обёртку-конструктор any ты ввел, чтобы избавится от new перед $:
function $(id) {
    return new any(id);
}

function any(id) {
    …
}

any.prototype.text = function (…) {…};

any нам не нужен больше нигде, кроме как в функции $, поэтому, чтобы он не валялся в глобальной области видимости, просто переносим его в свойства функции $:
function $(id) {
    return new $.any(id);
}

$.any = function (id) {
    …
};

$.any.prototype.text = function (…) {…};


а чтобы вообще забыть про этот any, инициализируем его прототип ссылкой на прототип $:
function $(id) {
    return new $.any(id);
}

$.any = function (id) {
    …
};

$.any.prototype = $.prototype;

$.prototype.text = function (…) {…};

теперь $.any.prototype и $.prototype указывают на один и тот же объект, но нам удобнее использовать ссылку $.prototype, про $.any.prototype забываем.

чтобы каждый раз при создании нового метода не писать $.prototype.methodName, можно сделать так:
$.prototype = {
    method1: function (…) {…},
    method2: function (…) {…},
    method3: function (…) {…}
};

но надо не забыть, что конструктор у нас $.any и методы должны находится в его прототипе:
$.prototype = {
    method1: function (…) {…},
    method2: function (…) {…},
    method3: function (…) {…}
};

$.any.prototype = $.prototype;

или короче
$.any.prototype = $.prototype = {
    method1: function (…) {…},
    method2: function (…) {…},
    method3: function (…) {…}
};

но при инициализации прототипа новым объектом, теряется ссылка на конструктор, поэтому и определяем её вручную ($.any нам не нужен, поэтому напишем просто $):
$.any.prototype = $.prototype = {
    constructor: $,
    method1: function (…) {…},
    method2: function (…) {…},
    method3: function (…) {…}
};

вот и получается та штука, что я показал в первый раз:
function $(id) {
    return new $.any(id);
}

$.any = function (id) {
    …
};

$.any.prototype = $.prototype = {
    constructor: $,
    method1: function (…) {…},
    method2: function (…) {…},
    method3: function (…) {…}
};


ссылка на конструктор хоть и не совсем правильная, но остается работоспособной, потому что return из конструктора вернет нужный объект:
var obj = new $(…); // так тоже будет работать

Последний раз редактировалось Octane, 19.01.2010 в 22:36.
Ответить с цитированием