【发布时间】:2015-07-22 13:49:01
【问题描述】:
我正在寻找一种模式,它既允许我创建我的函数原型可以访问的私有范围,并且我需要能够从该范围内访问实例。
例如,这就是我目前实现“私有方法”的方式(忽略代码实际做了什么,只看结构。)
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
};
})();
但是,上述方法不起作用,因为 IIFE 中 this 的值是全局对象,而不是实例。我需要一种访问实例的方法。
【问题讨论】:
-
当您拨打
instance.update(info)时,您将可以访问this。您可以将其显式传递给私有函数,或者使用.call()调用它们以设置this。 -
@Pointy Ahh,这样我就可以访问每个函数中的实例,但是您知道缓存植根于实例的查找并在 之间共享它们的好方法吗所有的功能? (而不必在多个函数中重复相同的初始化代码)
-
好吧,您将通过一种或另一种方式来处理实例引用。我不知道“缓存”的概念是否真的有意义;这些函数只有一个闭包,而不是每个实例一个闭包。
-
@Pointy 是的,我认为你是对的。我想我可以为更长的链制作 getter 函数并将结果缓存在 getter 函数本身中(作为次优解决方案)
-
缓存是什么意思?
标签: javascript design-patterns prototype private private-members