以下是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
属性我们可以猜测它代表了被增强的构造函数,但代码片段背后的逻辑对我来说是难以捉摸的。任何人都能详细解释一下吗谢谢。
答案 0 :(得分:2)
Function
是所有函数使用的全局对象,就像Number
是 Numbers 的全局对象一样。它们可以用作构造函数,但也适用于文字,即new Function();
和function () {}
都与Function
相关。
构造函数的prototype
Object 是您为该构造函数生成的所有实例定义属性和方法的位置。构造函数是函数,在 JavaScript 中,函数是对象。
方法只是函数的另一个名称,通常描述一个对象的属性 >
在Function.prototype
上设置方法因此意味着每个函数都会继承该方法。
因此,构造函数bar
(prototype
)Foo
上方法Foo.prototype.bar
中的this
等于
Foo.prototype
,则Foo.prototype.bar()
Foo
的实例,例如z
var z = new Foo(); z.bar();
this
使用call
,apply
还是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
上述示例与您的示例之间的唯一区别在于,此处的方法可以在对象本身找到,而在您的示例中,可以通过查找原型链找到它。