在此示例中了解原型和扩充

时间:2016-06-03 05:11:32

标签: javascript prototype this

以下说明和代码来自本书: 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的函数。添加的函数有两个参数(namefunc)。到目前为止一切都很好。

我的混淆开始出现在this.prototype[name] = func;行。 this关键字表示对象。因为我假设名为method的新函数将由某个点创建的函数调用(如上面第二个代码块中的函数integer()),那么我假设< / strong> this表示新创建的函数对象integer以及将来使用它的任何其他函数。

我还假设参数name是新创建的函数的名称,而func是正在创建的实际函数。

然后代码行return this;返回对象本身。

在上面的第二个代码块中,新创建的method函数用于创建名为integer的函数。内部函数integer存在以下代码行:

return Math[this < 0 ? 'ceiling' : 'floor'](this);

为什么this0进行比较?我理解Math[...]将向上舍入一个数字(如果插入了天花板)或向下(如果插入了楼层),尽管this背后的逻辑与0进行比较,同样是代码(this)完全失去了我。

2 个答案:

答案 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)

以下是正在发生的事件序列

  1. method函数在Function原型上定义。应该注意的是,只有来自Function的对象才具有此属性。因此,var a = {key: 'value'}等简单对象不具有prototype属性
  2. method上调用
  3. Number函数。它将检查它的原型链上是否具有名为method的函数,并且它将从Function继承而找到它。因此,使用integer定义函数Number。因此,从Number继承的所有对象都将具有一个名为integer的函数。
  4. 在数字integer上调用
  5. (-10/3)函数。它将再次检查数字integer的原型链上是否存在(-10/3)函数,因为我们只是向integer原型添加一个名为Number的函数,它会找到它并称之为。
  6. 要回答有关this在每个步骤中的值的具体问题,请在步骤1中指向Number,因为这是调用函数的位置,我们将创建传入的函数使用提供的名称Number原型。在第2步中,this指向数字(10/3),因为这是调用integer函数的内容。

    步骤1中的return this并非真正需要,但可以用于方法链

    0的比较只是实施的一部分。用户想要返回数字的整数部分。因此,如果我们调用(-3.4).integer(),我们希望返回-3函数给出的ceiling。但是,如果我们致电(3.4).integer(),我们希望返回由3

    提供的floor