实现继承
自己理解的继承:
function Animal(legsNumber){
this.legsNumber=legsNumber
}
//有一个Animal 父类的类属性 私有属性
Animal.propotype.kind="动物"
//这个Animal 的原型 为动物 共有属性
function Dog(name){
Animal.call(this,4)
this.name=name
}
//声明一个狗函数接受一name 调用Animal的私有属性
Dog.protopype.__proto__=Animal.prototype //这种继承方式已经被淘汰,因为每个浏览器不一定都有用.__proto__
let emptyAnimal=function(){空} //声明一个空函数 这个空函数可以删除Animal的有属性
emptyAnimal.protopype=Animal.prototype //这个空函数的原型继承Animal的原型
**如果没有这个空函数,直接让Dog.prototype=new Animal() 会在Dog的原型上添加一个腿数的属性
是new加的,new的五个属性中带有绑定原型的属性**
Dog.prototype=new emptyAnimal()
用class相对好理解一些:
class Dog extend Animal{ //extend可以继承Animal
construction(){
super(4) //这个super继承腿数 自动执行 this.legsNumber=legsNumber
}
}
new 都做了什么
- 构建新的临时对象
- 指定this=临时对象
- 临时对象.proto=构造函数.prototype
- 执行构造函数
- 返回临时对象
原型链
有一个对象x={}这个对象隐藏属性有个__proto__,这个__proto__指向Object.prototype
x.__?????__ === Object.prototype // 原型
我们说 x 的原型 是 Object.prototype,或者说 Object.prototype 是 x 的原型 而这个 ????? 属性的唯一作用就是用来指向 x 的原型的。
假设我们有一个数组对象 a=[] ,这个 a 也会有一个隐藏属性,叫做 __?????__这个属性会指向 Array.prototype ,即
a.__?????__ === Array.prototype
我们说 a 的原型是 Array.prototype ,跟上面的 x 一样。但又有一点不一样, 那就是 Array.prototype 也有一个隐藏属性 ????? ,指向 Object.prototype , 这样一来,a 就有两层原型:
a ===> Array.prototype ===> Object.prototype
想要修改x的原型不可以用.__proto__因为每个浏览器不一定都有用.__proto__所以 可以用const x = new 构造函数()
节流 触发技能后,技能CD了 用于点击后多少秒内不能再点击
const d =()=>{
console.log('闪现')
}
const throttle=(d,time)=>{
let timer=null
return()=>{
if(time===null){return}
d()
timer=setTimeout(()=>{
let timer=null
},time)
}
}
防抖 回城时不能被打断 用于边框拖拽后页面响应
const f=()=>{
console.log('回城啦')
}
const deboun=(f,time)=>{
let timer=null
return()=>{
if(timer){clearTimeout()}
timer=setTimeout(()=>{
f()
timer=null
},time)
}
}
const tp=deboun(f,3000)