以下说明和代码来自本书: Javascript,好的部分:
JavaScript允许扩充语言的基本类型。在 第3章,我们看到向Object.prototype添加一个方法就是这样 所有对象都可用的方法。这也适用于功能, 数组,字符串,数字,正则表达式和布尔值。对于 例如,通过扩充Function.prototype,我们可以创建一个方法 适用于所有功能:
Function.prototype.method = function (name, func) {
this.prototype[name] = func;
return this;
};
通过使用方法方法扩充Function.prototype,我们不再 必须输入prototype属性的名称。那点丑陋 现在可以隐藏了。 JavaScript没有单独的整数类型, 所以有时需要只提取a的整数部分 数。 JavaScript提供的方法很难实现。我们可以解决 它通过向Number.prototype添加一个整数方法。它使用其中之一 Math.ceiling或Math.floor,取决于数字的符号:
Number.method('integer', function ( ) {
return Math[this < 0 ? 'ceiling' : 'floor'](this);
});
document.writeln((-10 / 3).integer( )); // -3
问题:任何人都可以解释前两个代码块中发生的事件序列吗?
我当前对事件序列的理解:
上面的第一个代码块似乎是在函数原型method
中添加了一个名为Function.prototype
的函数。添加的函数有两个参数(name
和func
)。到目前为止一切都很好。
我的混淆开始出现在this.prototype[name] = func;
行。 this
关键字表示对象。因为我假设名为method
的新函数将由某个点创建的函数调用(如上面第二个代码块中的函数integer()
),那么我假设< / strong> this
表示新创建的函数对象integer
以及将来使用它的任何其他函数。
我还假设参数name
是新创建的函数的名称,而func
是正在创建的实际函数。
然后代码行return this;
返回对象本身。
在上面的第二个代码块中,新创建的method
函数用于创建名为integer
的函数。内部函数integer
存在以下代码行:
return Math[this < 0 ? 'ceiling' : 'floor'](this);
为什么this
与0
进行比较?我理解Math[...]
将向上舍入一个数字(如果插入了天花板)或向下(如果插入了楼层),尽管this
背后的逻辑与0
进行比较,同样是代码(this)
完全失去了我。
答案 0 :(得分:0)
我的混淆开始出现在
this.prototype[name] = func;
行。
方法方法应该在函数对象上调用,如:
Number.method(...)
以便函数中的 this 引用调用方法的对象。在上面,那是 Number 构造函数,this.prototype
将引用Number.prototype
。
我还假设参数名称是新创建的函数的名称,而func是正在创建的实际函数。
几乎。 name 是将要创建的属性的名称, func 是将分配给它的函数(严格来说,是对 func 的引用将被分配)。以下内容:
Number.method('integer', func)
将一个名为“integer”的属性添加到 Number.prototype ,并将作为其值的值(函数引用)指定为第二个参数。
为什么要比较为0?
该方法称为数字方法。为了评估表达式,可以将基元强制转换为对象,所以在:
(-10 / 3).integer();
-10/3
的结果是一个浮点值(一个数字原语,比方说3.67),方法整数被调用,因此在整数中, 此代表数字3.67。
将其与零进行比较的原因是它在正确的方向上缩短,例如+3.67 =&gt; 3和-3.67 =&gt; -3。同样可以通过截断数字来实现,但是当Crockford写他的书时,trunc不可用(尽管他可能知道它出现在ECMAScript 2015中)。他也可以使用|0
,但这可能对他的目的来说有点模糊。
答案 1 :(得分:0)
以下是正在发生的事件序列
method
函数在Function
原型上定义。应该注意的是,只有来自Function
的对象才具有此属性。因此,var a = {key: 'value'}
等简单对象不具有prototype
属性method
上调用Number
函数。它将检查它的原型链上是否具有名为method
的函数,并且它将从Function
继承而找到它。因此,使用integer
定义函数Number
。因此,从Number
继承的所有对象都将具有一个名为integer
的函数。integer
上调用(-10/3)
函数。它将再次检查数字integer
的原型链上是否存在(-10/3)
函数,因为我们只是向integer
原型添加一个名为Number
的函数,它会找到它并称之为。要回答有关this
在每个步骤中的值的具体问题,请在步骤1中指向Number
,因为这是调用函数的位置,我们将创建传入的函数使用提供的名称Number
原型。在第2步中,this
指向数字(10/3)
,因为这是调用integer
函数的内容。
步骤1中的return this
并非真正需要,但可以用于方法链
与0
的比较只是实施的一部分。用户想要返回数字的整数部分。因此,如果我们调用(-3.4).integer()
,我们希望返回-3
函数给出的ceiling
。但是,如果我们致电(3.4).integer()
,我们希望返回由3
floor