关于继承问题

来源:6-4 封装形变类(4)

soso_crazy

2019-07-08 18:06:23


//形变类

class Transform {

constructor(selector) {

this.el = document.querySelector(selector)

this._queue = []


// 用来保存每次执行方法的状态,免得被下一个方法覆盖掉前一个方法的位置等值

this.transform = {

translate: '',

scale: '',

rotate: ''

}

this.defaultTime = Transform.config.defaultTime

this.el.style.transition = `all ${0.3}s`

}


// 位移

translate(value, time) {

return this._add('translate', value, time)

}


// 缩放

scale(value, time) {

return this._add('scale', value, time)

}


// 形变

rotate(value, time) {

return this._add('rotate', value, time)

}


//添加动画

_add(type, value, time = this.defaultTime) {

this._queue.push({

type,

value,

time

})

return this

}


//添加完成,可以开始动了

done() {

this._start()

}


// 开始动 从队列中把动画一个个拿出来,拿一个动一个

_start() {

// 先进先出

//  每隔300毫秒执行一次_start(),当队列数组为空就不继续执行

if (this._queue.length == 0) {

return

}

//利用定时器,达到异步效果使每次都有动画效果

/* setTimeout(fn,0)的含义是,指定某个任务在主线程最早可得的空闲时间执行,也就是说,尽可能早得执行。它在"任务队列"的尾部添加一个事件,因此要等到同步任务和"任务队列"现有的事件都处理完,才会得到执行。 */

setTimeout(() => {

const info = this._queue.shift() //利用数组的shift方法达到先进先出效果

console.log(info)

this.el.style.transition = `all ${info.time / 1000}s`

this.el.style.transform = this._getTransform(info)


setTimeout(() => {

this._start()

}, info.time)

}, 0)

}


_getTransform({ type, value, time }) {

const _tsf = this.transform


switch (type) {

case 'translate':

_tsf.translate = `translate(${value})`

break

case 'scale':

_tsf.scale = `scale(${value})`

break

case 'rotate':

_tsf.rotate = `rotate(${value}deg)`

break

}

//返回手动设置方法的数值,直至有下一次相同方法的值传入才覆盖。避免每一步不同方法的值覆盖。

//   例如scale方法的不会覆盖translate方法移动的值,不会返回原位

return `${_tsf.translate} ${_tsf.scale} ${_tsf.rotate}`

}

}


Transform.config = {

defaultTime: 300

}


//继承Transform的类来扩展其他方法

class MultiTransform extends Transform {

multi(value, time) {

return this._add('multi', value, time)

}


_getTransform({ type, value, time }) {

const _tsf = this.transform


switch (type) {

case 'translate':

_tsf.translate = `translate(${value})`

break

case 'scale':

_tsf.scale = `scale(${value})`

break

case 'rotate':

_tsf.rotate = `rotate(${value}deg)`

break

case 'multi':

value.forEach(item => {

this._getTransform(item)

})

}

//返回手动设置方法的数值,直至有下一次相同方法的值传入才覆盖。避免每一步不同方法的值覆盖。

//   例如scale方法的不会覆盖translate方法移动的值,不会返回原位

return `${_tsf.translate} ${_tsf.scale} ${_tsf.rotate}`

}

}


const tf = new MultiTransform('.ball')

tf.translate('100px,100px')

.scale(2)

.rotate(180, 5000)

.multi([

{

type: 'translate',

value: '0,0'

},

{

type: 'scale',

value: 2

}

])

.done()


子类MultiTransform没有自己的star方法没有自己的this.transform等方法。它是如何继承父类的这里方法和属性的?

通过extends关键字继承父类的方法是如何使用父类的方法和父类的属性?


写回答

1回答

好帮手慕慕子

2019-07-08

同学你好,

  1. 子类是使用了关键字extends继承了Transform类所有的属性和方法。

  2. 可以直接通过点(.)的方式调用父类的方法和属性, 如下图所示

    http://img.mukewang.com/climg/5d2325cd0001d5f006100221.jpg

如果帮助到了你,欢迎采纳!

祝学习愉快~~~~


0

0 学习 · 10739 问题

查看课程