JavaScript中的原型继承

3
我从书籍《Javascript精粹》中选取了以下示例,在Firefox浏览器中运行:
Function.prototype.method = function(name, value){
    this.prototype[name] = value;
    return this;
}

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

console.log((-10 / 3).integer());

这是我对其工作原理的理解。我们使用 () 高优先级运算符来评估 -10/3,得到这个 64 位浮点值 -3.3... 由于 JavaScript 没有 Float、Decimal 或 Integer 类型,返回值为 Number。因此,我们在 Number 对象上调用 integer() 函数,它位于其原型链中。"this" 必须引用 Number 对象所持有的值。我们使用三元运算符来检查它是否为负数或正数,在这种情况下,我们运行:Math'ceil',因为它是负数。这将向上舍入该数字以产生 -3。
此脚本将起作用,但我不明白为什么 Number.method 不会抛出异常,因为 Number 不是 Function 的一种类型,而 method 是定义在 Function 的原型上的,而不是 Number 的原型上,Number 也没有从 Function 继承,它仅继承自 Object.prototype。

它是一个 instanceof 函数:Number instanceof Function === true - Patrick Evans
@PatrickEvans那么为什么Number缺乏执行能力呢?() - JohnMerlino
1个回答

3

请在控制台中尝试以下示例

Number是一个函数。

typeof Number
"function"

确认。

因此,Number 确实继承自 Function

Number instanceOf Function
"true"

就像所有其他JavaScript对象一样,Function也继承自Object

Function instanceof Object
true

那么为什么数字不能像函数一样被执行呢? - JohnMerlino
它可以像函数一样执行:var num = Number(13); - Patrick Evans
@PatrickEvans 那么,当所有东西都已经继承自Function时,Object.prototype和Object本身的目的是什么? - JohnMerlino
所有东西都不是从 Function 继承而来,而是从 Object 继承而来。例如:"string" instanceof Function === false - Patrick Evans
@JohnMerlino 并不是所有的东西都继承自Function!有很多JavaScript对象并不是函数。 - Jeremy J Starcher
我明白了,只是要注意String对象本身是Function的一种类型和实例:String instanceof Function。但是像"string"这样的字符串字面量不是。因此,我们实际上也可以在String上调用方法:String.method并且它会起作用。 - JohnMerlino

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接