我刚刚开始阅读道格拉斯·克罗克福德的“ Javascript The Good parts ”,其中他解释了增强基本类型。
Function.prototype.addMethod=function(name,func) {
this.prototype[name]=func;
return this;
};
执行此操作后, addMethod 可用于所有基本对象,例如 String , Number 等那让我感到困惑
为什么在我没有将其添加到 Object.prototype 时会发生这种情况?
为什么在 Function.prototype 中添加方法会反映在所有基本对象中?
答案 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)
JavaScript中的函数是对象。所有对象都有一个隐藏的链接 到Object.prototype。因此,对于第一个声明:
> `Function.prototype.addMethod=function(name,func) {}
您已声明一个链接到Function.prototype的函数,该函数本身链接到Object.prototype。