9

当我尝试制作此模块的不同实例时,它不起作用。

它似乎是一个单身人士。我一次只能有一个实例。

什么机制将构造函数 publik() 限制为仅在实例上具有?

http://jsfiddle.net/AVxZR/

var Module = ( function ()
{
    var publik = function ( )
    {
    };
    publik.prototype.test;
    publik.prototype.get = function()
    {
        document.getElementById( 'a'+test ).innerHTML = test;
    };
    publik.prototype.set = function( value )
    {
         test = value;
    };
    return publik;
} ) ();

var object1 = new Module();
var object2 = new Module();

object1.set('1');
object2.set('2');


object1.get();
object2.get();
4

4 回答 4

9

模块模式并不意味着以您描述的方式使用。它用于创建一个模块并对外部代码隐藏状态,即您公开一个外部代码可以与之通信的公共接口,但您将其余部分隐藏。

这可以防止其他代码依赖于您在内部使用的变量或函数,因为当您重命名任何内容时它们会中断。

此外,模块应该是单例的;拥有多个相同的模块就像在你的代码中有两个相同的类......没有意义。

这就是模块模式的样子。

var Module = (function($) {
    // the $ symbol is an imported alias

    // private variable
    var id = 0;

    // private function
    function increaseId()
    {
        return ++id;
    }

    // return public interface
    return {
        nextId: function() {
            // we have access to the private function here
            // as well as the private variable (btw)
            return increaseId();
        }
    }
}(jQuery)); // we import jQuery as a global symbol

Module.nextId(); // 1
Module.nextId(); // 2
Module.id; // undefined
Module.increaseId(); // error

您会看到 only.nextId()是如何暴露的,但没有其他私有变量/函数。

于 2012-05-23T14:59:55.723 回答
6

简短的回答:关闭。

长答案(如果我说得对,请发表评论,以便我更正):

  1. 当脚本加载时,您的 Module var 会立即执行。(由函数周围的括号表示。)()

  2. 在该模块中,您的 publik var 被声明,即使函数完成,它也会留在闭包中!

  3. 通过后续调用,您仍然可以访问自动执行的那个模块。简而言之,它总是获得相同的闭包空间和函数范围以及相同的对象 - 所以您的 publik 变量实际上总是相同的。

于 2012-05-21T19:28:28.980 回答
4

尝试重写 Module 类,以便您可以使用它来创建不同的实例。您可能希望将“测试”属性更改为静态属性,因为我已为您更改了它。

var Module = function(){}

    Module.prototype.test;
    Module.prototype.get = function()
    {
       document.getElementById( 'a'+this.test ).innerHTML = this.test;
    };
    Module.prototype.set = function( value )
    {
       this.test = value;
    }
于 2012-05-21T19:28:11.977 回答
1

您的代码不会创建单例。它只像一个单例,因为你的test变量是一个全局变量。

要修复此更改testthis.test以便将变量附加到每个实例。

于 2017-06-05T02:05:48.450 回答