FlipClock.js源码中Base.extend函数的具体功能是什么?
FlipClock.js 中 Base.extend 函数作用详解
这个函数是FlipClock源码内置的原型继承实现工具,核心作用是基于现有类扩展生成新的子类,是ES6标准class语法普及之前,JS模拟面向对象类继承的典型实现方案,支持自定义子类的实例属性、实例方法、静态属性、静态方法,还封装了父类方法调用、类型转换等扩展能力。
核心执行逻辑拆解
1. 原型构建阶段
- 先开启
Base._prototyping标记位,避免构造实例原型时触发不必要的初始化副作用 - 执行
new this()得到父类的实例作为子类的原型对象 - 把传入的第一个参数
_instance里的所有属性/方法合并到原型对象上,即子类的所有实例都可以共享这些方法 - 给原型对象新增
base()预留方法,后续子类实例可以通过这个方法调用父类的同名方法 - 最后删除
Base._prototyping标记位,恢复正常实例化逻辑
2. 构造函数包装阶段
对原有的原型构造函数做了一层代理封装,兼容两种调用场景:
- 正常实例化场景:如果是通过
new关键字调用子类,就执行原构造函数的初始化逻辑,把调用参数透传给原构造函数 - 类型转换场景:如果不是通过
new调用,且第一个入参不为空,就会把子类原型上的所有属性/方法合并到传入的第一个对象上,相当于给已有对象挂载当前子类的所有能力,完成类型转换
3. 类接口完善阶段
给新生成的子类补全继承相关的属性和方法:
- 新增
ancestor属性指向父类,方便追溯继承链 - 把父类的
extend、forEach、implement等工具方法复制给子类,支持子类继续被扩展生成下一代子类 - 修正子类的
prototype指向,兼容处理toString、valueOf的原型方法调用逻辑 - 把传入的第二个参数
_static里的所有属性/方法合并到子类本身,作为子类的静态属性/方法 - 如果子类定义了
init静态初始化方法,自动执行该方法完成类初始化 - 最终返回生成的新子类
典型使用示例
// 扩展生成子类 var Counter = Base.extend({ // 实例构造函数 constructor: function(initValue) { this.count = initValue || 0 }, // 自定义实例方法 increment: function() { this.count++ return this.count } }, { // 自定义静态方法 getType: function() { return 'CounterClass' } }) // 实例化使用 const counter = new Counter(10) console.log(counter.increment()) // 输出11 console.log(Counter.getType()) // 输出CounterClass // 子类可以继续扩展 var StepCounter = Counter.extend({ // 扩展实例方法 increment: function(step = 1) { this.count += step return this.count } }) const stepCounter = new StepCounter(10) console.log(stepCounter.increment(5)) // 输出15
内容的提问来源于stack exchange,提问作者Deepak Jha
相关产品推荐
相关产品推荐

