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等.这让我感到困惑
当我没有将它添加到Object.prototype时,为什么会发生这种情况?
为什么在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的额外成员函数.你可以用原型做许多其他时髦的事情,比如更换原型,或者更换原型的原型,但我不是那里的专家.
归档时间: |
|
查看次数: |
2093 次 |
最近记录: |