javascript - 当从 JavaScript 构造函数返回对象时(避免 'new' ),如何实现公共(public)成员?

标签 javascript constructor module-pattern

我已经开始编写我的“类”类型 JavaScript 函数,例如模块模式或揭示模块模式。这避免了使用“new”,并允许我在一个地方定义哪些函数是公共(public)的。但是,我一直无法了解如何在此模式中使用和访问公共(public)数据成员。

例如下面的成员“id”可以通过 myobj.getId() 访问,但 myobj.id 未定义。

function setup(){
    var myobj = MyObject();
    myobj.initialize();
    alert(myobj.getId()); // returns 3, as expected
    alert(myobj.id); // returns undefined
}
function MyObject(){
    var id;
    function initialize(){
        //do some stuff that initializes data including...
        id = 3;
    }
    return{
        initialize:initialize,
        id:id,
        getId:function(){ return id;}
    }
}

有没有办法让 myobj.id 返回在initialize()中设置的值?

最佳答案

你的问题是你没有利用关闭的优势。 id:id 行创建一个新变量作为您要返回的对象文字的成员。它具有默认值未定义。然后,您再次将相同的变量 id 分配回其自身,undefined

此外,模块是单个对象实例,而不是工厂函数。尝试这样的事情:

var myModule = (function(opts) {
    var foo = opts.foo || 0,    //private variables with default values
        bar = opts.bar || 0,    // if none are passed in

        product = function() {      //private method
            return (foo * bar);
        };

    return {
        getFoo : function() {   //public methods
            return foo;
        },
        fooTimesBar : function() {
            return product();
        }
    }
})({
    foo : 5,                    //options object
    bar : 7
});

模块模式的核心是一个自执行的匿名函数,它声明变量,然后返回一个对象,该对象通过闭包拥有对这些变量的特权访问权限。

末尾的额外括号,其中包含一个对象文字以及一些传入的选项,执行该函数,然后返回一个对象并将其分配给 myModule

声明为该返回对象的成员的任何内容都可以公开访问。即使函数返回后,返回对象中的代码也可以通过闭包访问匿名函数中定义的变量。匿名函数中声明的变量实际上是私有(private)的。函数外部的代码无法寻址它们,除非通过返回对象中提供的方法。

整个过程会在 myObject 中生成一个对象实例。最多只能创建一个,这是模块的定义。然而,可以采用类似的方法来创建工厂函数。

关于javascript - 当从 JavaScript 构造函数返回对象时(避免 'new' ),如何实现公共(public)成员?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3257797/

相关文章:

javascript - jquery ajax 发布到自己不起作用

c++ - 继承和重载默认构造函数

c++ - 使用gtest测试构造函数内部条件的方法是什么?

c++ - 在转换中使用仿函数(带/不带构造函数)

javascript - 在javascript中有条件地实例化模块模式的一个实例

closures - Javascript 模块使用 Apply 并返回 this

javascript - 多个 "classes"位于同一命名空间中,但位于不同的文件中

javascript - 如何从js文件调用jconfirm jquery

javascript - Node.js 在脚本之间传输数据

javascript - 在 Javascript 中获取滚动位置