gpt4 book ai didi

javascript - 使用 ECMAScript 5 get/set properties with revealing module pattern

转载 作者:行者123 更新时间:2023-11-30 12:23:58 26 4
gpt4 key购买 nike

考虑以下基于 contrived bit of JavaScriptrevealing module pattern:

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 方法的属性并通过对 moduleName 的内部引用调用这些 getter/setter 方法?举一个具体的例子,考虑以下 similarly contrived C# example :

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 函数路由?

最佳答案

你是对的,因为你不能在变量上定义 setter/getter。它必须是对象的属性。解决方案是将模块的内部转换为一个对象,同时仍然公开相同的公共(public) API:

var RevealingModuleSample = function () {

var self = {

_moduleName: "DefaultModuleName",

set moduleName(name) {
console.log("setting module name: " + name);
self._moduleName = name;
},

get moduleName() {
return self._moduleName;
},

init: function (name) {
self.moduleName = name;
},

issueAlert: function () {
alert(self.moduleName + " module is running");
}

};

return {
init: self.init,
issueAlert: self.issueAlert
};
}();

RevealingModuleSample.init("SampleModule");
RevealingModuleSample.issueAlert();

暴露对象方法的一个后果是,当方法被调用时,this 的上下文或值会丢失。因此在对象内部使用了 self,这是对 this 的简单引用。

我想另一种方法是将所有私有(private)变量存储在一个单独的对象中,但这对我来说似乎不太优雅。

关于javascript - 使用 ECMAScript 5 get/set properties with revealing module pattern,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30112789/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com