views:

64

answers:

1

Douglas Crockford wrote in his book (Page 4):

Throughout the book, a method method is used to define new methods, This is its definition:

Function.prototype.method = function (name, func) {
    this.prototype[name] = func;
    return this;
};

Then he starts to use this method to add method in Number, String, Function, Object, Array, RegExp, and here is the complete list:

P33:

Number.method('integer', function () {...});
String.method('trim', function () {...});

P40 (not sure if there is a misprint in Page 41: the end () ):

String.method('deentityify', function () {...}());

P43 & P44:

Function.method('curry', function () {...});

P47 (I am confused here, don't know why Crockford define new method, and he seems never use new method in the book):

Function.method('new', function () {...});

P48:

Function.method('inherits', function (Parent) {...});

P54:

Object.method('superior', function (name) {...});

P62:

Array.method('reduce', function (f, value) {...});

P79:

Array.method('pop', function () {...});
Array.method('push', function () {...});
Array.method('shift', function () {...});

P82:

Array.method('splice', function (start, deleteCount) {...});

P84:

Function.method('bind', function (that) {...});

P88:

RegExp.method('test', function (string) {...});
String.method('charAt', function (pos) {...});

P90 (not sure if there is a misprint in Page 91: the end () ):

String.method('entityify', function () {...}());

The definition method is based on Function, why it can be used in Number, String, Object, Array, RegExp besides Function? And can this method be used to other data type?

Another small question: in Page 63 & 64, the definition of Array.dim, Array.matrix, Array.identity didn't use above method, why?

+2  A: 

All native functions in JavaScript inherit from Function.prototype. Number, String, Object, Array and RegExp are all functions, therefore they inherit from Function.prototype.

method is intended to be called on constructor functions. Its job is to make the function you supply to it into a method that exists for every object created by the constructor function on which you called method. You will notice that in the functions that Crockford passes to method, he makes use of this, which is a reference to the object on which the method was called. Array.dim, Array.matrix and Array.identity make no use of this because they operate independently of any particular array and hence do not need to be methods of individual array objects. They are assigned as properties of the Array function for convenience: they could equally well exist on their own as functions in the global scope.

Tim Down
I am not sure if Number, String, Object, Array, RegExp (Maybe Function and Date and Boolean as well) are all functions. It seems they are Global Objects.
John
@John: I assure you, they are all functions. Try `alert(typeof Number)` etc. if you don't believe me, or check the specification (section 15.1.4): http://www.ecma-international.org/publications/standards/Ecma-262.htm. They are also properties of the global object, if that's what you were getting at.
Tim Down
@John: I see, you've looked at Mozilla's documentation at https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects. It's correct in that as well as being functions, `Number`, `String`, `Object` et al are also objects, because all functions are objects; it's also true that as properties of the global object, they're available globally so could be described as "global objects". However, in light of the existence of the officially defined term "global object", I find Mozilla's use of the term "Global Objects" rather unhelpful.
Tim Down
@Tim, Thank you! You even know the reason why I have the question. I cannot understand Mozilla's term "Global Objects" very well, maybe this is my next question in SO.
John