无法实现模块模式 [英] Unable to implement module pattern

查看:92
本文介绍了无法实现模块模式的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想从Douglas Crockford的书Javascript:The Good Parts中重现一些代码。这个想法是使用闭包对象封装,并避免JavaScript的内在全局变量。

  var serial_maker = function(){

//生成一个生成唯一字符串的对象。 A
//唯一字符串由两部分组成:前缀
//和序列号。该对象带有
//方法用于设置前缀和序列
// number,以及gensym方法生成唯一的
//字符串。

var prefix ='';
var seq = 0;
return {
set_prefix:function(p){
prefix = String(p);
},
set_seq:function(s){
seq = s;
},
gensym:function(){
var result = prefix + seq;
seq + = 1;
return result;
}
};
}();

var seqer = serial_maker();
seqer.set_prefix ='Q';
seqer.set_seq = 1000;
var unique = seqer.gensym(); // unique isQ1000

Chrome收到错误:



未捕获的TypeError:属性
'serial_maker'的对象[object
DOMWindow]不是函数
(匿名函数) p>

我做错了什么?



编辑:我应该说这段代码完全从书中复制和粘贴...

解决方案

您试图将函数的结果作为函数执行,正在为函数分配值。
Try:

  var seqer = serial_maker; 
seqer.set_prefix('Q');
seqer.set_seq(1000);
var unique = seqer.gensym();

另请参阅 jsFiddle


I am trying to reproduce some code from the book "Javascript: The Good Parts" by Douglas Crockford. The idea is to use closures for object encapsulation and avoid Javascript's inherent global variables.

var serial_maker = function (  ) {

// Produce an object that produces unique strings. A
// unique string is made up of two parts: a prefix
// and a sequence number. The object comes with
// methods for setting the prefix and sequence
// number, and a gensym method that produces unique
// strings.

    var prefix = '';
    var seq = 0;
    return {
        set_prefix: function (p) {
            prefix = String(p);
        },
        set_seq: function (s) {
            seq = s;
        },
        gensym: function (  ) {
            var result = prefix + seq;
            seq += 1;
            return result;
        }
    };
}(  );

var seqer = serial_maker(  );
seqer.set_prefix = 'Q';
seqer.set_seq = 1000;
var unique = seqer.gensym(  );    // unique is "Q1000"

Chrome is picking up the error:

Uncaught TypeError: Property 'serial_maker' of object [object DOMWindow] is not a function (anonymous function)

What am I doing wrong?

EDIT: I should say this code is entirely copy and pasted from the book...

解决方案

You are trying to execute the result of a function as a function, and are assigning values to functions. Try:

var seqer = serial_maker;
seqer.set_prefix('Q');
seqer.set_seq(1000);
var unique = seqer.gensym();

Also see this jsFiddle

这篇关于无法实现模块模式的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆