重新定义JavaScript中的构造函数

JavaScript中,构造函数只是一些使用new操作符时被调用的函数。它们并不会属于某个类,也不会实例化一个类。实际上,它们甚至都不能说是一种特殊的函数类型,它们只是被new操作符调用的普通函数而已实际上并不存在所谓的“构造函数”,只有对于函数的“构造调用”

使用call、apply、bind时应该注意的事项

如果你把null或者undefined作为this的绑定对象传入callapply或者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的操作都不会起作用。


设计模式

本博客所有文章除特别声明外,均采用 CC BY-SA 3.0协议 。转载请注明出处!

使用TinyPng在本地压缩图片 上一篇
事件循环 下一篇