在JavaScript中扩充类型

时间:2011-07-29 05:09:59

标签: javascript

我正在阅读Douglas Crockford的 JavaScript:The Good Parts ,我对某些事情感到有些困惑。在第4章中,在Augmenting Types下,他创建了一个添加方法的快捷方式。

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

他说:

  

通过使用'method'方法扩充Function.prototype,我们不再   必须输入prototype属性的名称。那点丑陋   现在可以隐藏了。

然后他继续用它来为数字原型添加一个'整数'方法。

Number.method('integer', function () {
    return Math[this < 0 ? 'ceil' : 'floor'](this);
});

document.writeln((-10 / 3).integer()); // -3

我在这里有点困惑...因为我们在 Function 原型中添加了'方法'方法,而不是数字原型。据我所知,Number对象不会从Function原型继承(虽然我可能在那里错了)。我看到这有效,但我不明白为什么Number对象能够使用这个'方法'方法来添加...方法。

4 个答案:

答案 0 :(得分:11)

我认为这是有效的,因为Number 是一个函数。

如下所示:http://jsfiddle.net/zCbdB/1

答案 1 :(得分:5)

Number实际上是一个功能。任何构造函数都是函数。

考虑javascript中的类型的一种方法是说类型只是具有Foo属性的函数.prototype。这是使用new关键字创建的任何对象的原型,如new Foo()中所示。按照惯例,Foo大写以表示它是构造函数。

答案 2 :(得分:4)

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

在这个语句块中,您已经创建了一个名为method的方法,通过原型继承可以访问所有对象。函数派生自Function.prototype,派生自Object.prototype。因此,字符串和数字将能够访问此声明中名为method的Object.prototype方法。

 Number.method('integer', function () {
    return Math[this < 0 ? 'ceil' : 'floor'](this);
  });

document.writeln((-10 / 3).integer()); // -3

在第二个块中,您基本上调用了Object原型中已有的方法,并在这种情况下传递了所需的参数name ='integer',值等于

function () {
    return Math[this < 0 ? 'ceil' : 'floor'](this);
  });

最后在最后一个语句中,您传入名称值对,结果为-3

答案 3 :(得分:2)

以下是一个可能有用的示例:

var num = Number('1.2');
alert(num instanceof Number); // true
alert(num instanceof Function); // false
alert(Number instanceof Number); // false
alert(Number instanceof Function); // true

另一种思考方式是在Javascript Function中将双重任务作为类类型 - 类型的类型。因此,这是为类型添加方法。