这个代表什么代表什么?

时间:2013-09-26 01:29:40

标签: javascript prototype this

以下是JavaScript中两个广泛使用的代码段:

Function.prototype.method = function (name, func) {
        this.prototype[name] = func;
        return this;
};

Number.method('integer', function () {
    return Math[this < 0 ? 'ceil' : 'floor'](this);
});

显然,第二个代码段中的this代表调用增强integer方法的Number对象。第一个代码段中的this怎么样?从prototype属性我们可以猜测它代表了被增强的构造函数,但代码片段背后的逻辑对我来说是难以捉摸的。任何人都能详细解释一下吗谢谢。

3 个答案:

答案 0 :(得分:2)

Function是所有函数使用的全局对象,就像Number Numbers 的全局对象一样。它们可以用作构造函数,但也适用于文字,即new Function();function () {}都与Function相关。

构造函数的prototype Object 是您为该构造函数生成的所有实例定义属性和方法的位置。构造函数是函数,在 JavaScript 中,函数对象

方法只是函数的另一个名称,通常描述一个对象的属性 >

Function.prototype上设置方法因此意味着每个函数都会继承该方法。

因此,构造函数barprototypeFoo上方法Foo.prototype.bar中的this等于

    如果调用Foo.prototype ,则
  • Foo.prototype.bar()
  • 如果从该实例调用Foo实例,例如z
  • 中的var z = new Foo(); z.bar();
  • 无论您定义this使用callapply还是bind
  • 如果在没有上下文的情况下调用全局对象,即var b = Foo.prototype.bar; b();

在您的代码中,this应该是上述第二个,因为Number函数,因为它是构造函数 ,因此是Function的实例。

答案 1 :(得分:0)

method方法中,this将引用该方法所需的Function对象。在示例中,它将是对Number函数的引用。

由于Number是一个内置类,您可以使用new关键字创建它,它实际上是一个函数,这就是Function原型适用于它的原因。

答案 2 :(得分:0)

作为方法调用的任何函数内的this值始终是调用该方法的对象。所以在Number.method()中,它将是Number构造函数。

当您在任何其他对象上调用方法时,它的行为方式完全相同,例如:

var obj = {
    someMethod : function() { 
        console.log(this);
    }
}
obj.someMethod(); // logs obj

上述示例与您的示例之间的唯一区别在于,此处的方法可以在对象本身找到,而在您的示例中,可以通过查找原型链找到它。