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

时间:2009-09-03 11:21:50

标签: javascript inheritance prototypal-inheritance

我刚刚开始阅读道格拉斯·克罗克福德的“ Javascript The Good parts ”,其中他解释了增强基本类型。

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

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

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

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

3 个答案:

答案 0 :(得分:16)

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

,例如

var s = '';

你可以做到

String.addMethod(...);

但不是

s.addMethod(...);

JavaScript类型系统的简要说明来自:

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

例如:给出

function MyFunction(x) { this.myX = x; }

如果你像

那样调用它
var myObj = new MyFunction(10);

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

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

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

正如这些内置对象是由函数创建的,每个函数也都是由“函数”函数创建的(yikes!)。

现在开始制作原型。

在上面的示例中,如果您在某处写

MyFunction.prototype.someNewMethod = function() {}

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

答案 1 :(得分:1)

在面向对象的javascript中,一个函数可以作为一个类和一个类。构造函数。因此,如果您的类名为MyObject,则可以执行以下操作:

// create a class/constructor
function MyObject() {
   // ...
}

// add a static method to the MyObject class
MyObject.someFunction = function() {
   // ...
}

// add an instance method to the MyObject Class
MyObject.prototype.someFunction = function() {
   // ...
}

在您的示例中,addMethod作为实例方法添加到Function类,这意味着它可用于Function的所有实例。 MyObject函数/类/构造函数是Function的一个实例,因此您可以在其上调用addMethod。这适用于大多数任何对象类型,但不适用于IE和其他一些浏览器中的HTMLElements。

答案 2 :(得分:1)

  1. JavaScript中的函数是对象。所有对象都有一个隐藏的链接 到Object.prototype。因此,对于第一个声明:

    > `Function.prototype.addMethod=function(name,func) {}
    

    您已声明一个链接到Function.prototype的函数,该函数本身链接到Object.prototype。

  2. 对于第二部分,它只是一个赋值,您将名称值对设置为Object.prototype,并将add方法返回给所有String,Number对象,因为它全部在原型中声明。