美文网首页
原生JS继承相关概念

原生JS继承相关概念

作者: 池鱼_故渊 | 来源:发表于2021-03-05 16:03 被阅读0次

原型链继承

  this.name = 'ww'
}
//首先把getName 方法挂载到 Parent 原型
Parent.prototype.getName = function(){
  consooe.log(this.name)
}
function Child(){
  
}
// 然后 实例化 Parent 挂载到 Child的原型上,这样,Child 原型上就有了name属性和getName方法
Child.prototype = new Parent() 
// new Parent() 实际上就是创建一个新的对象

var child = new Child()

console.log(child.getName())

// 原型链继承有一个问题就是 如果this.name是引用类型的,那么继承的属性相互间会相互影响,如果儿子更改,那么父亲的值也会相应更改

借用构造函数(经典继承)

  this.name = ['ww','ee']
}
function Child(){
// 我们new Child 相当于 把Parent上下文的代码在自己的环境执行了一遍,
// 所以每次 new Child 都拥有一个自己 name 属性,且相互不会影响
  Parent.call(this)
}
var child1 = new Child()
child1.name.push('cc')
var child2 = new Child()
child2.name.push('dd')
console.log(child1,child2)
// Child {name: Array(3)}name: (3) ["ww", "ee", "cc"]__proto__: Object Child {name: Array(3)}name: (3) ["ww", "ee", "dd"]__proto__: Object

缺点 :每次new (实例化)都会重现创建一次

组合继承 (结合原型链继承和借用构造函数继承)

基本思想是,父亲的方法挂载到原型上,然后实例化挂载到儿子的原型上,这样儿子就有了父亲的方法,然后用借用构造函数的方法,让父亲的实例化属性被儿子继承,并且都拥有自己的独立属性,互不影响
看代码

  this.name = "ww"
  this.like = ['ss','dd']
}
Parent.prototype.sayName = function(){
  console.log(this.name)
}
function Child(){
  Parent.call(this)
}
Child.prototype = new Parent()

var child = new Child()
child.sayName() // ww

// 并且 儿子可以传值给父亲

function Parent(name){
  this.name = name
}
Parent.prototype.sayName = function(){
  console.log(this.name)
}
function Child(name,){
  Parent.call(this,name)
}
Child.prototype = new Parent()

var child = new Child('jj')
console.log(child.name) // jj

优点:融合原型链继承和构造函数的优点,是 JavaScript 中最常用的继承模式。

原型式继承

对参数浅复制,Object.create()的原理,实际就是浅拷贝

  function Fun() { };
  Fun.prototype = obj;
  return new Fun()
}

引用类型始终被共享

寄生式继承

缺点:和借用构造函数继承一样,每次都会被创建

    var clone = Object.create(o);
    clone.sayName = function () {
        console.log('hi');
    }
    return clone;
}

寄生组合继承(实际上就是寄生式和组合式继承的结合)

组合继承已经很大程度解决了引用类型公用,和方法继承的问题,但是,在使用的时候我们会调用两次 Parent ,所以我们需要解决这个问题 只调用一次,寄生组合正好可以解决这一问题,详细看代码

  this.name = name
}
Parent.prototype.sayName = function(){
  console.log(this.name)
}
function Child(name){
  Parent.call(this,name)
}
function create(o){
  function F(){}
   F.prototype = o
   return new F()
}
function Prototype(child,parent){
  var prototype = create(parent.prototype)
  prototype.constructor = child
  child.prototype = prototype
}
// 当我们使用的时候:
Prototype(Child, Parent);

目前最完美继承方式

参考链接 :
https://github.com/mqyqingfeng/Blog/issues/16
https://juejin.cn/post/6914216540468576263

相关文章

  • 原生JS继承相关概念

    原型链继承 借用构造函数(经典继承) 缺点 :每次new (实例化)都会重现创建一次 组合继承 (结合原型链继承和...

  • js原生继承

    1、继承第一种方式:对象冒充function Parent(username){this.username = u...

  • JS继承

    JS中的继承 许多OO语言都支持两种继承方式:接口继承和实现继承; 因为JS中没有类和接口的概念 , 所以JS不支...

  • 原生JS相关

    1.ES6语法 let const 箭头函数 Promise 展开操作符 默认参数 import export 2...

  • #js继承

    js继承的概念 js里常用的如下两种继承方式: 原型链继承(对象间的继承)类式继承(构造函数间的继承) 类式继承是...

  • JavaScript 10

    js继承的概念 1.通过原型链方式实现继承(对象间的继承) 2.类式继承(构造函数间的继承) 由于js不像Java...

  • JS继承的几种方式

    关于Js继承的几种方式,总结一下,以便查看。 第一种 prototype 引用型原型继承 语言支持:js原生支持的...

  • JS相关概念

    CSS和JS在网页中的放置顺序是怎样的? 解释白屏和FOUC async和defer的作用是什么?有什么区别 简述...

  • JS相关概念

    CSS和JS在网页中的放置顺序是怎样的? css放在head中,用link标签引入: JS放在body中,且在所有...

  • JS相关概念

    CSS和JS在网页中的放置顺序是怎样的? CSS要放头部head中的link标签内引入。js文件要放在 标签中,...

网友评论

      本文标题:原生JS继承相关概念

      本文链接:https://www.haomeiwen.com/subject/ixarqltx.html