欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

js的几种继承,好记忆

程序员文章站 2024-01-30 10:59:04
...

继承

继承: 子类继承父类,子类产生的实力可以使用父类中的方法。

类式继承

​ 核心: 将子类的原型指向父类的实例

​ 注意: 给子类添加方法一定要在继承之后(因为原型链,指向的是父类的)

类式继承的缺点:

原型对象中多了没用的属性

原型对象中丢失了 constructor 属性

重复赋值过程

function People(name, age) {
    this.name = name;
    this.age  = age;
}
People.prototype.say = function(){
    console.log("我是"+ this.name);
}
function Child(name, age, sex) {
    this.name = name;
    this.age  = age;
    this.sex  = sex;
}
// 类式继承   将子类的原型指向父类的实例
Child.prototype = new People();

var xiaoming = new Child('小明')
xiaoming.say();

为了解决他的缺点。 解决constructor

缺少 contructor。可以手动添加一个。

Child.prototype.contructor = Child;

解决 重复赋值的过程

​ 首先提一下,为什么多出来无用属性。 如果父类的属性和子类的属性有相同的。那么就重复赋值。但是会用子类的属性。 (就近)

构造函数继承(不是真正的继承)

继承是子类使用父类的方法,构造函数继承是不能的

function People(name, age) {
    this.name = name;
    this.age  = age;
}
People.prototype.say = function(){
    console.log("我是"+ this.name);
}
function Child(name, age, sex) {
    //构造函数继承
    People.apply(this, arguments);
    this.sex  = sex;
}

var xiaoming = new Child('小明')
xiaoming.say();

子类是不能调用父类的方法,所以他不是 真正的继承。

组合继承

类式继承+ 构造函数继承

function People(name, age) {
    this.name = name;
    this.age  = age;
}
People.prototype.say = function(){
    console.log("我是"+ this.name);
}
function Child(name, age, sex) {
    //构造函数继承
    People.apply(this, arguments);
    this.sex  = sex;
}
// 类式继承   将子类的原型指向父类的实例
Child.prototype = new People();

var xiaoming = new Child('小明')
xiaoming.say();

解决 多出来无用属性

为什么会多出来无用属性呢, 是 因为 子类的 原型 指向 父类的实例, 父类是有方法体的, 实例化的时候,就会有方法体中所有属性。 所以要解决这个, 需要一个空方法体的函数, 来做这个中间件。

寄生式继承

function People(name, age) {
    this.name = name;
    this.age  = age;
}

function Child(name) {
    this.name = name;
}

// 寄生式继承
function JiSheng(Child, Perple) {
    function F(){};
    F.prototype = People.prototype;
    Child.prototype = new F();
}
JiSheng(Child, People);
People.prototype.say = function() {
    console.log('我要'+ this.name + "说话");
}

var xiaoming = new Child('小明');

xiaoming.say();

寄生式组合继承

​ 寄生式+ 构造函数

function People(name) {
    this.name = name;
    
}

function Child(name, age) {
    People.apply(this, arguments);
    this.age  = age;
}

// 寄生式继承
function JiSheng(Child, Perple) {
    function F(){};
    F.prototype = People.prototype;
    Child.prototype = new F();
}
JiSheng(Child, People);
People.prototype.say = function() {
    console.log('我要'+ this.name + "说话");
}

var xiaoming = new Child('小明');

xiaoming.say();
相关标签: 知识点 js

上一篇: 预处理 const sizeof

下一篇: