Javascript扩充基本类型(原型继承)

sri*_*ptr 12 javascript inheritance prototypal-inheritance

我刚开始阅读Douglas Crockford的" Javascript The Good parts ",他解释了有关扩充基本类型的内容.

Function.prototype.addMethod=function(name,func) {
    this.prototype[name]=func; 
    return this; 
};
Run Code Online (Sandbox Code Playgroud)

执行此操作后的那一刻,addMethod可用于所有基本对象,如String,Number等.这让我感到困惑

  1. 当我没有将它添加到Object.prototype时,为什么会发生这种情况?

  2. 为什么在Function.prototype中添加方法会反映在所有基本对象中?

eri*_*len 16

他可能意味着在这样做之后,addMethod可用于所有基本对象 对象类型,如String,Number等.这是因为String对象是一个函数(但是String创建的对象不是).

例如,给定

var s = '';
Run Code Online (Sandbox Code Playgroud)

你可以做

String.addMethod(...);
Run Code Online (Sandbox Code Playgroud)

但不是

s.addMethod(...);
Run Code Online (Sandbox Code Playgroud)

这里有JavaScript类型系统的简要说明:

JavaScript没有类的正常概念.相反,通过在调用它时将new关键字放在前面,可以将任何函数转换为构造函数,从而实现相同的效果.

例如:给定

function MyFunction(x) { this.myX = x; }
Run Code Online (Sandbox Code Playgroud)

如果你像它一样调用它

var myObj = new MyFunction(10);
Run Code Online (Sandbox Code Playgroud)

它将创建一个名为myObj的对象.该对象将有一个名为myX的成员变量.函数MyFunction被认为是对象的构造函数(并存储在"构造函数"属性中.

(额外的问题:如果您在没有新关键字的情况下调用上述函数会发生什么,即var x = MyFunction(10)答案可能会让任何明智的人感到惊讶.)

现在您已经看到了如何将任意函数转换为构造函数.内置对象完全相同,字符串对象由函数String创建,数字由函数Number创建,等等.

就像这些内置对象是由函数创建的一样,这些函数中的每一个也都是由"函数"函数创建的(yikes!).

现在开始原型.

在上面的例子中,如果你在某处写

MyFunction.prototype.someNewMethod = function() {}
Run Code Online (Sandbox Code Playgroud)

由MyFunction构造函数/函数创建的所有对象似乎都有一个名为someNewMethod的额外成员函数.你可以用原型做许多其他时髦的事情,比如更换原型,或者更换原型的原型,但我不是那里的专家.