【发布时间】:2015-05-07 22:34:09
【问题描述】:
在revealing module pattern 的基础上考虑以下contrived bit of JavaScript:
var RevealingModuleSample = function () {
var moduleName = "DefaultModuleName",
init = function (name) {
moduleName = name
},
issueAlert = function () {
alert(moduleName + " module is running");
}
return {
init: init,
issueAlert: issueAlert
};
} ();
RevealingModuleSample.init("SampleModule");
RevealingModuleSample.issueAlert();
有没有办法将 moduleName 转换为具有 getter 和 setter 方法的属性并让这些 getter/setter 方法通过对 moduleName 的内部引用来调用?举一个具体的例子,请考虑以下 @ 987654323@:
public class ContrivedCsharpExample
{
private string _moduleName;
protected string moduleName
{
get {
// Perhaps some logging code here that records the moduleName was retrieved.
return this._moduleName;
}
set {
// Some code here that ensure that a valid moduleName was passed.
this._moduleName = value;
}
}
public void init(string moduleName) {
this.moduleName = moduleName;
}
public void issueAlert() {
Console.WriteLine(this.moduleName);
}
public static void Main()
{
var module = new ContrivedCsharpExample();
module.init("SampleC#Module");
module.issueAlert();
}
}
请注意,在类内部,方法正在调用具有 getter/setter 的属性。这允许我们在这些 getter/setter 方法中添加额外的代码,而如果我们只使用类外部可用的属性,“init”和“issueAlert”方法将不得不直接检查字段,以及我们添加的任何逻辑getter/setter 将被绕过。
我看到的问题是,在揭示模块模式中,“moduleName”变量不是对象的属性——它只是当前范围内的变量。因此,您不能只是将其拉出并用 get/set 对替换它。对吧?
There is a related question on StackOverflow,但在这种情况下,提问者正在寻找一种方法来返回一个具有 getter/setter 代码的属性的对象,以便模块的外部用户可以路由他们的属性访问通过 get/set 方法。问题中列出了解决方案,但提供的解决方案不允许模块内部的代码在不直接操作变量的情况下访问该属性,绕过 get/set 函数。
我认为这对于显示模块模式是不可能的,对吗?有没有办法让模块内部的调用通过 get/set 函数路由?
【问题讨论】:
-
必须使用显示模型模式吗?如果需要,JavaScript 使用关键字
this。这对我来说真的不重要。我可以使用它。这只是一个问题。 -
由于所有这些模块函数都是在本地声明的,getter/setter 无论如何都不能从外部获得,无论如何你都必须抽出变量引用,我建议用简单的函数替换它们调用(不是人为对象上的访问器属性)。
标签: javascript properties