重新定义JavaScript中的构造函数
在JavaScript
中,构造函数只是一些使用new
操作符时被调用的函数。它们并不会属于某个类,也不会实例化一个类。实际上,它们甚至都不能说是一种特殊的函数类型,它们只是被new
操作符调用的普通函数而已。实际上并不存在所谓的“构造函数”,只有对于函数的“构造调用”。
使用call、apply、bind时应该注意的事项
如果你把null
或者undefined
作为this
的绑定对象传入call
、apply
或者bind
,这些值在调用时会被忽略,实际应用的是默认绑定规则:
function foo() {
console.log(this.a);
}
var a = 2;
foo.call(null); // 2
常见的情况是如果函数并不关心this
的话,你仍然需要传入一个占位符,这时null
可能是一个不错的选择。
function foo(a, b) {
console.log("a:" + a + ", b:" + b);
}
// 把数组“展开”成参数
foo.apply(null, [2, 3]); // a:2, b:3
// 使用bind(...)进行柯里化
var bar = foo.bind(null, 2);
bar(3); // a:2, b:3
然而,总是使用null
来忽略this
绑定可能产生一些副作用。如果某个函数确实使用了this
(比如第三方库中的一个函数),那默认绑定规则会把this
绑定到全局对象(浏览器中这个对象是window
),这将导致不可预计的后果(比如修改全局对象)。
一种更好的方式是传入一个特殊的对象:Object.create(null)
——空对象,这样不会对我们的程序有任何影响,函数中任何对于this
的操作都不会起作用。