我正在阅读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对象能够使用这个'方法'方法来添加...方法。
答案 0 :(得分:11)
我认为这是有效的,因为Number
是一个函数。
答案 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
中将双重任务作为类类型 - 类型的类型。因此,这是为类型添加方法。