一直对JS的继承概念有点模糊, 大体知道是怎么回事, 但也没有去深究过, 今天翻阅【JavaScript语言精髓】一书的第五章比较深刻进行认知, 特此记录一番。
JavaScript是一门基于原型的语言, 其对象是直接从其他对象继承的
伪类
- 当我们构造一个函数对象时, 会默认生成一个constructor属性, 其值就是自身
- 构造一个伪类, 继承Person
- 但这些伪类操作会让人觉得怪异, 我们需要隐藏这些prototype, 这是书中使用的通用代码片段
上述代码片段, 为Function.prototype增加一个method方法,
这样我们就可以通过String.method("newMethod", function(){...})
(而不是String.prototype.newMethod = function(){...})来为String扩展新方法了。
- 于是我们也可以扩展一个方法, 用于继承:
- 那么可以通过这样的来进行继承
现在我们基本达到了继承的目的, 但是也存在一些问题, 比如父类属性能公开访问, 在继承时需要加上new关键字等。
函数化构造器
- 我们将不使用new关键字, 进行对象构造, 基本分为四个步骤
- 按照这个原则, 我们试着重新构造之前的继承关系:
- 之前通过伪类进行继承, 我们需要重复构造器Person已经完成的工作, 而通过函数化构造则不用关心父类构造, 只需调用父类构造即可
- 现在, 我们就能直接调用父类方法, 并且防止了父类私有属性被直接访问。
现在的前端项目都使用CoffeeScript, 其支持类和继承, 想看看它是怎么理解JS的类和继承的。
- 编译后的JS为