Я ищу шаблон, который позволяет мне создать частную область, к которой имеет доступ мой прототип функции, и мне нужно иметь доступ к экземпляру из этой области.
Например, именно так я в настоящее время добиваюсь «приватных методов» (не обращайте внимания на то, что на самом деле делает код, просто посмотрите на структуру).
function InfoPreview() {
this.element = document.createElement('div');
}
//Private Methods
InfoPreview.prototype.__newLine = function () {
this.element.appendChild(createElement({tagName:'br'}));
};
InfoPreview.prototype.__padLeft = function(level) {
var padding = createElement({tagName: 'span'});
this.element.appendChild(padding);
$(padding).width(level * 10);
};
InfoPreview.prototype.__print = function(string) {
var span = createElement({ tagName: 'span', textContent: string });
this.element.appendChild(span);
this.element.style["margin-right"]='10px';
};
InfoPreview.prototype.__puts = function(string) {
this.__print(string);
this.__newLine();
};
//Public Methods
InfoPreview.prototype.update = function(info) {
$(this.element).empty();
for (var record in info) {
this.__puts(record);
}
};
Обратите внимание, что я вообще не создаю приватные методы, а просто использую соглашение об именах. Кроме того, обратите внимание, что у меня нет возможности кэшировать поиск по цепочке, такой как this.element
.
Я хотел бы создать частную область, используя шаблон раскрывающего модуля, например:
InfoPreview.prototype = (function() {
var self = this, //<- `this` is actually the global object now.
el = self.element;
var newLine = function () {
el.appendChild(createElement({tagName:'br'}));
};
var padLeft = function(level) {
var padding = createElement({tagName: 'span'});
el.appendChild(padding);
$(padding).width(level * 10);
};
var print = function(string) {
var span = createElement({ tagName: 'span', textContent: string });
el.appendChild(span);
el.style["margin-right"]='10px';
};
var puts = function(string) {
print(string);
newLine();
};
var update = function(info) {
$(el).empty();
for (var record in info) {
puts(record);
}
};
return {
update: update
};
})();
Однако описанный выше подход не работает, потому что значение this
в IIFE является глобальным объектом, а не экземпляром. Мне нужен способ получить доступ к экземпляру.
instance.update(info)
, у вас будет доступ кthis
. Вы можете либо явно передать его частным функциям, либо вызвать их с помощью.call()
для установкиthis
. - person Pointy   schedule 22.07.2015el
вместоthis.element
. Это быстрее и для моих пальцев, и для процессора. Лучше было бы слово «псевдоним». - person Luke   schedule 22.07.2015this
иthis.element
на этом уровне, потому что тогда он кэширует одно значение для всех экземпляров, вы можете просто пропустить текущиеthis
илиelement
в качестве простого параметра, такого какvar padLeft = function(el, level) {
, и вызватьpadLeft(this.element)
- person Grundy   schedule 22.07.2015