也许关于JavaScript传播得最广泛和持久的谬误之一是认为this
关键字指代它所出现的函数。可怕的错误。
this
关键字是根据函数如何被执行而动态绑定的,而事实上有四种简单的规则可以用来理解和完全决定this
绑定。
和this
密切相关的是对象原型属性,它是一种属性的查询链,与查询词法作用域变量的方式相似。但是原型中包含的是另一个关于JS的巨大谬误:模拟(山寨)类和继承(所谓的“原型继承”)的想法。
不幸的是,渴望将类和继承的设计模式思想带入JavaScript只是你能做的最差劲儿的事情,因为虽然语法可能欺骗你,使你认为有类这样的东西存在,但实际上原型机制在行为上是根本相反的。
目前的问题是,是忽略这种错位并假装你实现的是“继承”更好,还是学习并接纳对象原型系统实际的工作方式更恰当。后者被称为“行为委托”更合适。
这不光是语法上的偏好问题。委托是一种完全不同的,更强大的设计模式,其中的原因之一就是它取代了使用类和继承进行设计的需要。但是对于以谈论JavaScript的一生为主题的几乎所有的其他博客,书籍,和论坛来说,这些断言绝对是打脸的。
我对委托和继承做出的宣言不是源于对语言和其语法的厌恶,而是来自于渴望看到这门语言的真实力量被正确地利用,渴望看到无尽的困惑与沮丧被一扫而光。
但是我举出的关于原型和委托的例子可要比我在这里乱说的东西复杂得多。如果你准备好重新思考你认为你所了解的关于JavaScript“类”和“继承”的一切,我给你一个机会来“服用红色的药丸”,并且看一看本系列的 this与对象原型 的第四到六章。