es5中类的讲解以及继承

168 阅读1分钟

最近学习typescript,发现es5用的类也就是构造函数差不多忘光了,现在有时间整理一下

es5中简单的类(构造函数以及原型链静态方法)

 function Person() {  //构造函数挂载属性以及方法
      this.name="小明"
      this.age = 18
      this.run=function() {
         console.log(`${this.name}在运动`)
      }
      
   }
   //原型链上面的属性会被多个实例共享 构造函数不会(相当于共享单车和你自己的车)
   Person.prototype.sex="男" //原型链挂载属性
   Person.prototype.work=function(){ //原型链挂载方法
      console.log(`${this.name}在工作`)
   }
   Person.getname = function (params) { //静态方法挂载
      console.log('我是静态方法')
   }
   var p = new Person()
   p.run()
   p.work()
   Person.getname() //静态方法调用

es5中继承(对象冒充继承)

  function Person() {  //构造函数挂载属性以及方法
      this.name="小明"
      this.age = 18
      this.run=function() {
         console.log(`${this.name}在运动`)
      }
      
   }
   //原型链上面的属性会被多个实例共享 构造函数不会(相当于共享单车和你自己的车)
   Person.prototype.sex="男" //原型链挂载属性
   Person.prototype.work=function(){ //原型链挂载方法
      console.log(`${this.name}在工作`)
   }
   // 子类 通过冒充对象方式继承
   function Web(){
      Person.call(this)
   }
   var w = new Web()
   console.log(w.name) //正确
   w.run()// 正确
   w.work() // 报错 冒充对象继承并不能继承原型链上的属性以及方法

es5中继承(原型链继承)

  function Person() {  //构造函数挂载属性以及方法
      this.name="小明"
      this.age = 18
      this.run=function() {
         console.log(`${this.name}在运动`)
      }
      
   }
   //原型链上面的属性会被多个实例共享 构造函数不会(相当于共享单车和你自己的车)
   Person.prototype.sex="男" //原型链挂载属性
   Person.prototype.work=function(){ //原型链挂载方法
      console.log(`${this.name}在工作`)
   }
   function Web(){
      
   }
   //原型链继承
   Web.prototype = new Person()
   var w = new Web()
   console.log(w.name)//可以打印 
   w.run() //可以打印 
   w.work() //可以打印 

原型链继承可以继承构造函数以及原型连上的属性和方法,但是一旦传递参数子类接收不到

  function Person(name,age) {  //构造函数挂载属性以及方法
      this.name=name
      this.age = age
      this.run=function() {
         console.log(`${this.name}在运动`)
      }
      
   }
   //原型链上面的属性会被多个实例共享 构造函数不会(相当于共享单车和你自己的车)
   Person.prototype.sex="男" //原型链挂载属性
   Person.prototype.work=function(){ //原型链挂载方法
      console.log(`${this.name}在工作`)
   }
   function Web(){
      
   }
   //原型链继承 
   Web.prototype = new Person()
   var w = new Web('xiaoming',18) //传递的参数接收不到
   console.log(w.name) // undefined
   w.run()  //undefined在运动
   w.work() //undefined在工作

es5中继承(原型链+对象冒充组合继承)

 function Person(name,age) {  //构造函数挂载属性以及方法
      this.name=name
      this.age = age
      this.run=function() {
         console.log(`${this.name}在运动`)
      }
      
   }
   //原型链上面的属性会被多个实例共享 构造函数不会(相当于共享单车和你自己的车)
   Person.prototype.sex="男" //原型链挂载属性
   Person.prototype.work=function(){ //原型链挂载方法
      console.log(`${this.name}在工作`)
   }
   function Web(name){
      Person.call(this,name) //冒充对象继承
   }
   //原型链继承 
   Web.prototype = Person.prototype // 原型链继承
   var w = new Web('xiaoming',18) 
   console.log(w.name) // xiaoming
   w.run()  //xiaoming在运动
   w.work() //xiaoming在工作