开发者

Unable to implement module pattern

I am trying to reproduce开发者_Python百科 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


There are two errors in this code example:

  1. The definition of serial_maker is finished with () which invokes the anonymous function. That makes the next line:

    var seqer = serial_maker();
    

    erroneous since serial_maker is not the function but the object returned by the anonymous function.

  2. Once the previous error is fixed the two lines:

    seqer.set_prefix = 'Q';
    seqer.set_seq = 10000;
    

    should change to:

    seqer.set_prefix('Q');
    seqer.set_seq(10000);
    

(Source: http://oreilly.com/catalog/errata.csp?isbn=9780596517748&order=date)


I am currently working through the book and I see a redundant pair of parentheses () in your posted code, when I compare it to the book. You have:

        }
    };
}(  );

it should be:

        }
    };
};

Along with, the additional answers where the 'Q' and the 1000 need to be wrapped in ().

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜