刚读完"JavaScript:The Good Parts" - 好书.但我对第33-34页上的一个非常重要的主题感到困惑 - 增加类型.它描述了添加到Function.prototype的新方法的创建,因此当使用新方法调用时,所有函数都将具有该方法.很公平.但随后的示例显示了此方法正在使用Numbers和Strings.我想,这是对象 - 而不是功能.我在这里错过了什么?
Function.prototype.method = function (name, func) {
this.prototype[name] = func;
return this;
};
Run Code Online (Sandbox Code Playgroud)
用法示例:
Number.method('integer', function() {
return Math[this < 0 ? 'ceiling' : 'floor'](this);
});
document.writeln((-10 / 3).integer()); //-3
Run Code Online (Sandbox Code Playgroud)
Our*_*ros 12
函数对象与函数实例对象
首先,在javascript中,函数也是一个对象.从这里,我的意思不是new()构造创建的对象,而是函数本身.为了避免混淆,我会将这些对象称为 Function对象,并将使用new()构造函数创建的对象称为Function实例对象.
_ proto _和原型属性
javascript中的任何函数对象都有两个属性:_ proto _和prototype.此外,任何Function实例对象(使用新构造函数创建)都具有属性_proto _.该_原_是什么定义继承.可以找到一些关于此的好资源
http://zeekat.nl/articles/constructors-considered-mildly-confusing.html
如何定义继承?
如果objA和objC通过任意数量的_proto _连接,则对象objA继承另一个对象objC .因此,如果objA具有_ proto _等于objB,并且objB具有_ proto _等于objC,则objA继承objB和objC,而objB继承objC.
继承是什么意思?
这意味着任何继承对象都可以使用继承对象的任何属性.
什么是Function.prototype
它是每个函数对象的_ proto _所指的对象.这意味着每个Function对象都可以访问Function.prototype的属性,因为每个Function对象都继承Function.prototype对象.这也意味着如果将method属性添加到Function.prototype对象,它将可用于javascript中所有可能的Function对象.这包括字符串,数字等.
this.prototype [name] = func;
这指的是函数对象时,"方法"是从调用函数对象就像数字,字符串,等等.这意味着我们现在有一个新的属性Function对象名称为"名",它的功能"功能".
Function对象的原型属性有什么用处
甲函数对象的原型是由所指的功能实例对象的_ _原使用该功能的新构建体产生.
如果执行以下操作:
Number.method('integer',function(){...});
然后Number.prototype中定义了整数方法.这意味着每个Number 函数实例对象,例如new Number(2.4),将从Number.prototype"继承"这个新属性'integer',因为该Number 函数实例对象将其_ proto _设置为Number.prototype.
Poi*_*nty 11
您可以向Number原型添加方法,因此每个Number 实例都可以访问它.换句话说,因为在Number原型上有一个名为"integer"的属性,所以从任何Number实例访问该属性的任何尝试都将成功.这就是将属性放在构造函数原型上的重点.
当JavaScript原始数字出现在.运算符的左侧时,语言会自动将其存储在Number实例中,以便方法调用有意义.
编辑 - 让我们看一下"方法"功能的工作原理.在通话中
Number.method( "integer", function() { ... } )
Run Code Online (Sandbox Code Playgroud)
这是怎么回事?好吧,在"方法"函数中,"name"参数是"整数".然后将函数参数指定为属性this.prototype.什么是this在"方法"功能的该调用?它是Number构造函数.因此,"方法"函数 - 在函数原型上,因此可用于所有函数实例,例如Number构造函数 - 将给定函数添加为所涉及的构造函数原型的属性.
为什么"method"属性作为Number构造函数的属性可见?因为Number构造函数本身就是一个函数."方法"函数是作为Function原型的属性创建的,这意味着它对每个函数实例都可见 - 包括Number构造函数.
| 归档时间: |
|
| 查看次数: |
4427 次 |
| 最近记录: |