Этот код эквивалентен вашему коду, но его легче понять:
A.prototype = {
getWindow: function() {
var win = new B.window();
this.getWindow = function() {
return win;
};
return win;
}
}
Использование:
Сначала создайте экземпляр A:
var a = new A();
Затем вызовите getWindow
для этого экземпляра:
a.getWindow();
Здесь вызывается getWindow
метод A.prototype
. Как вы можете видеть в моем коде выше, A.prototype.getWindow
создаст new B.window()
и вернет его , однако между ними он также создаст getWindow
метод на объекте экземпляра сам.
Теперь, если вы снова позвоните getWindow
:
a.getWindow();
A.prototype.getWindow
больше не вызывается , поскольку сам объект экземпляра имеет метод getWindow
. Этот метод возвращает тот же объект «win», который был возвращен при первом вызове метода getWindow
.
Ваш шаблон позволяет нескольким A
экземплярам использовать один и тот же метод A.prototype.getWindow
для создания своих собственных объектов "win". Учтите это:
var a1 = new A,
a2 = new A,
a3 = new A;
a1.getWindow(); // creates window W1 and returns it
a2.getWindow(); // creates window W2 and returns it
a1.getWindow(); // returns window W1
a2.getWindow(); // returns window W2
a3.getWindow(); // creates window W3 and returns it
a1.getWindow(); // returns window W1
a2.getWindow(); // returns window W2
a3.getWindow(); // returns window W3
Это довольно полезный паттерн :)
Обновление:
Это ваш код:
return (this.getWindow = function() {
return win;
})();
Во-первых, давайте посмотрим на выражение в скобках:
this.getWindow = function() { return win; }
Как видите, это выражение присваивания. Объект анонимной функции назначается свойству getWindow
объекта, на который ссылается this
(объект экземпляра).
Обратите внимание, что эта функция возвращает объект win
.
Результатом этого выражения присваивания является сам объект функции! Это означает, что значение в скобках является объектом функции.
Теперь давайте посмотрим на всю картину:
return ( the_function_object )();
Мы можем удалить парены, поскольку они нам больше не нужны:
return the_function_object();
Как видите, объект функции вызывается, и затем возвращается возвращаемое значение этой функции.
Как упоминалось выше, функция возвращает win
. Следовательно, код разрешается следующим образом:
return win;
Итак, что делает ваш код:
FIRST назначает function() { return win; }
на this.getWindow
.
ВТОРОЙ, он возвращает результат вызова той функции, которая win
.
Мой код дает тот же результат, но его легче понять:
this.getWindow = function() {
return win;
};
return win;