javascript - 使用 ECMAScript 5 获取/设置属性并揭示模块模式

标签 javascript properties

根据 contrived bit of JavaScript 考虑以下 revealing 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 获取/设置属性并揭示模块模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30112789/

相关文章:

javascript - 有什么方法可以更改在浏览器中注册的 CSS 类

javascript - 为什么要评估 if block

javascript - 使用 Angular 将 json 对象中的通用文本字符串转换为有效的 url

python - 如何在 Python 中将类方法应用于我自己的类的属性

c# - 如何在字符串中自动显示类的所有属性及其值?

java - 在函数 jquery.i18n.prop() 中处理换行符

javascript - 下面的函数闭包有什么问题?

android - 如何检测操作系统或设备类型等系统信息

C# 属性,为什么要在赋值前检查是否相等

jquery - 通过 CSS 属性设置元素属性,这可能吗?