JavaScript - 好的部分:函数原型与对象原型

sve*_*son 17 javascript

刚读完"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构造函数.