Js的继承方法

Js继承

要想继承,就必选有一个要被继承的产业

function who(name){
    this.name = name
    this.say = function(){
        console.log(this.name)
    }
}
who.prototype.age = 10

第一种方法:原型链继承

function xiaoming(){
    this.name = 'xiaoming'
}
xiaoming.prototype = new who()
let xiaoming1 = new xiaoming()
console.log(xiaoming1)  //who()
console.log(xiaoming1.name) //xiaoming
console.log(xiaoming1.age)  //10
console.log(xiaoming1 instanceof who)  //true

重点:让新实例的原型等于父级的实例xiaoming.prototype = new who()
优点:

  1. 可继承父级构造函数属性
  2. 可继承父级原型的属性

缺点:

  1. 新实例无法像父级构造函数传参
  2. 所有的新实例都会共享父级构造函数的属性,一个新实例改变了父级构造函数属性的值,那么其他的新实例也会跟着改变

第二种方法:构造函数继承

function xiaohong(){
    who.call(this,"xiaohong")
}
let xiaohong1 = new xiaohong()
console.log(xiaohong1)  //who()
console.log(xiaohong1.name)  //xiaohong
console.log(xiaohong1.age)  //undefined
console.log(xiaohong1 instanceof who)  //false

重点:使用call()apply()的方法将父类函数继承过来
优点:

  1. 可以像父级函数传参
  2. 解决了父级函数属性共享的问题
  3. 可以用call()apply()继承多个

缺点:

  1. 只能继承父级构造函数的属性,无法继承父级构造函数原型上的属性
  2. 无法实现构造函数的复用,每次用每次都得继承

第三种方法:组合继承(常用)

function xiaopeng(name){
    who.call(this,name)
}
xiaopeng.prototype = new who()
let xiaopeng1 = new xiaopeng('xiaopeng')
console.log(xiaopeng1.name)  //xiaopeng
console.log(xiaopeng1.age)  //10
console.log(xiaopeng1 instanceof who)  //true

重点:使用了原型继承和构造函数继承

优点:

  1. 可以继承父级原型上的属性
  2. 可以传参也可以复用
  3. 每个实例继承到的构造函数都是私有的

缺点:

  1. 消耗内存:调用两次父级构造函数

第四种方法:原型式继承

function color(obj){
    function fn(){}
    fn.prototype = obj
    return new fn
}
let red = new who()
let red1 = color(red)
red1.name = 'red'
console.log(red1.name)  //red
console.log(red1.age)  //10
console.log(red1 instanceof who)  //true

重点:先封装一个函数,用来返回这个函数的调用,那么这个函数就变成一个可以随意添加属性的实例或对象
优点:类似于复制一个对象
缺点:所有的实例都会继承构造函数原型上的属性

第五种方法:寄生式继承

function color(obj){
    function fn(){}
    fn.prototype = obj
    return new fn
}
let red = new who()
//以上是原型式继承

function colorObject(obj){
    let col = color(obj)
    col.name = 'green'
    return col
}

let red1 = colorObject(red)

console.log(red1.name)  //green
console.log(red1.age)  //10
console.log(red instanceof who)  //true
console.log(typeof colorObject)  //function
console.log(typeof red1)  //object

重点:就是在原型式的外面再包一个函数体
优点:没有创建自定义类型,这个函数顺理成章就成了创建的新对象
缺点:跟借用构造函数模式一样,每次创建对象都会创建一遍方法

第六种方法:组合寄生继承(常用)

function color(obj){
    function fn(){}
    fn.prototype = obj
    return new fn
}
let red = color(who.prototype)

function blue(){
    who.call(this)
}
blue.prototype = red
red.constructor = blue
let blue1 = new blue()
console.log(blue1.age)  //10

重点:使用寄生继承和组合继承的方法
优点:

  1. 只调用一次父级构造函数
  2. 原型链保持不变

原文地址:https://www.cnblogs.com/kaizhadiyishuai/p/12386459.html

时间: 2024-07-31 20:10:43

Js的继承方法的相关文章

【深入JavaScript】一种JS的继承方法

这些天读了John Resig的<Secrets of JavaScript Ninja>,其中讨论到JS中实现继承的方案,非常有趣,自己探索了一下,形成了笔记,放到这里. 这个方案在Resig的博客上也有,虽然代码略微有点不一致,但核心思想是一样的,请戳 这里 . <html> <head> <title></title> </head> <body> <script type="text/javascr

js oop中的三种继承方法

JS OOP 中的三种继承方法: 很多读者关于js opp的继承比较模糊,本文总结了oop中的三种继承方法,以助于读者进行区分. <继承使用一个子类继承另一个父类,子类可以自动拥有父类的属性和方法.(继承的两方,发生在两个类之间)> 一.通过object实现继承 1:定义父类 function Parent(){} 2:定义子类 funtion Son(){} 3:通过原型给Object对象添加一个扩展方法. Object.prototype.customExtend = function(p

关于 JS 面向对象继承属性和方法的小例子

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title></title> </head> <body> <h1>关于 JS 面向对象继承属性和方法的小例子</h1> </body> </html> <script> //人的构造函

JS原型链与几种继承方法的对比

继承的方式有两种:接口继承.实现继承接口继承:即虚函数,父类只定义接口,不具体实现子类继承接口,自己负责实现这个方法,运行时动态决定调用哪个实现.实现继承:父类实现的方法,子类可以直接调用 JS中只支持实现继承,以原型链来实现. 回顾一下构造函数.原型.实例的关系:每个构造函数都有一个原型对象,原型对象又都包含一个constructor指针指向构造函数,实例包含一个_proto_内部属性指向原型对象. 继承的实现方法(父类型叫Parent,子类型叫Child)原本Child.prototype

5种JS继承方法

<!DOCTYPE html> <html> <head> <meta charset=" utf-8"> <meta name="author" content="http://www.jb51.net/" /> <title>5种JS继承方法</title> <script type="text/javascript"> //1

JS中的类,类的继承方法

大牛请无视此篇! 首先我们定义一个类,方法很简单,就像我们定义函数一样,只不过我们为了与函数区分,名称首字母要大写,看代码: function Person (){ } 这就是一个很简单的Poson类,然后我们通过类来进行实例化对象,通俗的说创建对象吧,我们以前用过的json对象,和我们现在要用的标准对象 //简单的json对象(此对象与Person类没任何关系,只是让大家观察两者的写法区别) var obj = { name:‘lemon’, age:'18' } //通过Person来实例化

js中继承的几种用法总结(apply,call,prototype)

本篇文章主要介绍了js中继承的几种用法总结(apply,call,prototype) 需要的朋友可以过来参考下,希望对大家有所帮助 一,js中对象继承 js中有三种继承方式 1.js原型(prototype)实现继承 <SPAN style="<SPAN style="FONT-SIZE: 18px"><html>   <body>  <script type="text/javascript"> 

JS原型继承和类式继承

类式继承(构造函数) JS中其实是没有类的概念的,所谓的类也是模拟出来的.特别是当我们是用new 关键字的时候,就使得"类"的概念就越像其他语言中的类了.类式继承是在函数对象内调用父类的构造函数,使得自身获得父类的方法和属性.call和apply方法为类式继承提供了支持.通过改变this的作用环境,使得子类本身具有父类的各种属性. JavaScript var father = function() { this.age = 52; this.say = function() { al

js中call方法的使用介绍

js call call 方法 请参阅 应用于:Function 对象 要求 版本 5.5 调用一个对象的一个方法,以另一个对象替换当前对象. call([thisObj[,arg1[, arg2[, [,.argN]]]]]) 参数 thisObj 可选项.将被用作当前对象的对象. arg1, arg2, , argN 可选项.将被传递方法参数序列. 说明 call 方法可以用来代替另一个对象调用一个方法.call 方法可将一个函数的对象上下文从初始的上下文改变为由 thisObj 指定的新对