javascript - JavaScript 中用于自定义构造函数的模块模式

标签 javascript module-pattern

当我有自定义构造函数时,我尝试在 JavaScript 中应用模块模式。让我们举个例子:

// Assume I need `name` as private
function Dog(name){
    this.name = name;
}

我可以将上面重写为:

function Dog(name) {

    let dogName = name;

    return {

        getName : function () {
            return dogName;
        },

        setName : function (name) {
            dogName = name;
        }
    }
}

上面的代码没有正确的constructor属性和Dog.prototype,并且返回的对象的原型(prototype)不匹配.

为了解决这个问题,我做了 2 个修复:

function Dog(name) {

    let dogName = name;

    return {

        // Fix 1
        constructor : Dog,

        getName : function () {
            return dogName;
        },

        setName : function (name) {
            dogName = name;
        }
    }
}


let d2 = new Dog("Tony");
// Fix 2 : This is painful as every time I need to set this up
Object.setPrototypeOf(d2 , Dog.prototype);

如您所见,修复 2 很痛苦。每次我必须创建一个对象时,我都需要这样做。 还有更好的办法吗?

让我们不要偏离我们的讨论,即 getter 和 setter 应该移至原型(prototype)。以上只是我正在使用的一个简单示例。

最佳答案

这里的问题是您在“构造函数”中返回一个对象文字,对象文字具有 Object 原型(prototype)。您不应该在构造函数中返回,您应该像在第一个代码片段中那样将内容分配给 this

function Dog(name) {

    let dogName = name;

    this.getName = function () {
        return dogName;
    };

    this.setName = function (name) {
        dogName = name;
    };
}

但这不是实现类的常见模式,您甚至没有使用原型(prototype),因此不清楚为什么原型(prototype)对您很重要。显然,这种方法允许您关闭变量以使其成为“私有(private)”变量,而使用原型(prototype)是不可能的。然而,这种方法的开销更大,因为 Dog 的每个实例都将拥有自己的 getNamesetName 函数,这是“私有(private)”的标准约定变量和方法的方法是用下划线作为前缀,以便您可以按预期使用原型(prototype)

function Dog(name) {
    this._name = name;
}

Dog.prototype.getName = function () {
    return this._name;
};

Dog.prototype.setName = function (name) {
    this._name = name;
};

关于javascript - JavaScript 中用于自定义构造函数的模块模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60422763/

相关文章:

javascript - chrome.idle 在 chrome 扩展中未定义

javascript - jQuery 添加 DOM 元素

javascript - 如何使我的搜索栏在 React Native 中正常工作?

javascript - 如何将带有括号的属性的 JSON 字符串转换为 Typescript

javascript - 了解在 JavaScript 中以模块模式命名返回对象的好处

javascript - 是否可以动态访问模块模式中的私有(private)变量?

javascript - 我如何专业地构建我的模块模式 Javascript 项目?

Javascript 模块模式和空对象

javascript - 包装库部分的代码构造是什么,它有什么用?

javascript - ag-grid 中的行分组