常见的四种原型继承

常见的四种原型继承

1、最原始的继承 子类原型继承父类的实例

	function Father() {
      this.firstName = '三'
    }
    var father = new Father();
    Father.prototype.lastName = '张';

    function Son() {
      this.firstName = '四';
      this.sex = '男';
    }
    // 子类原型继承父类的实例
    Son.prototype = father;
    var son = new Son()
    // son继承father
    console.log(son.lastName, son.firstName, son.sex);//张  四  男
    son.firstName = '五';
    console.log(son.firstName, father.firstName); //五  三
    Father.prototype.size = {
      face: '黄'
    }
    father.size.face = '白';
    console.log(son.size.face, father.size.face); //白 白

通过 Son.prototype = father实现继承,改变子级的属性父级不会改变。但如果父级的圆形链上属性发生改变,子级的也会改变。

2、原型的继承

	function Father() {}
    Father.prototype.lastName = 'shuai';
    Father.prototype.fn = function () {
      console.log('我是Father中函数输出的内容');
    }

    function Son() {}
    Son.prototype.sex = 'women';
    Son.prototype = Father.prototype;
    var son = new Son();

    Son.prototype.wife = 'girl';
    var father = new Father()

    console.log(son.wife, father.wife); //girl girl

原型的继承他们使用 同一个原型,会造成原型的污染

3、call方法继承(非标准继承)

	function Father(name,age,sex){
            // son中添加对应的属性
            // this -> Son中的this
            this.name = name;
            this.age = age;
            this.sex = sex;
    }
    Father.prototype.car = '4个圈';
    function Son(name,age,sex){
       Father.call(this,name,age);
       this.girlFriend = 'girl1';
    }
    var son = new Son('张三',38,);  
    console.log(son);

4、圣杯模式,定义一个新的构造函数,将新构造函数原型等于父级原型,子级原型等于新的构造函数的实例对象

		function Father(){}
        Father.prototype.lastName = 'OY';
        
        function Son(){}

        // 定义一个新的构造函数
        function Temp(){}
        Temp.prototype = Father.prototype;
        // new Temp()  出现一个新的{}   {}.__proto__  == Father.prototype
        Son.prototype = new Temp();

        var son = new Son();
        // son.__proto__ -> temp -> Father.prototype

        console.log(son.__proto__.constructor);// Father(){}  Son默认情况下

        // 记录son原本的构造函数
        Son.prototype.constructor = Son;
        // 记录son原本继承自谁 添加一个属性去记录
        Son.prototype.uber = Father.prototype;
        console.log(son.uber);

这种方法会让原始继承的原型会改变,所以加入到一个uber属性中。

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
原型继承(Prototype Inheritance)和经典继承(Classical Inheritance)是两种不同的继承方式,用于在 JavaScript 中实现对象之间的继承关系。 1. 原型继承: - 在原型继承中,每个对象都有一个指向其原型的链接。当我们访问对象的属性或方法时,如果对象本身没有该属性或方法,JavaScript 引擎会沿着原型链向上查找,直到找到该属性或方法。 - 原型继承使用 `prototype` 属性来建立对象之间的继承关系。通过将一个对象设置为另一个对象的原型,后者将继承前者的属性和方法。 - 这种继承方式在 JavaScript 中是默认的,所有的对象都直接或间接地继承自 `Object.prototype`。 2. 经典继承: - 经典继承是一种基于类的继承方式,它通过定义类和创建类的实例来实现对象之间的继承关系。 - 在经典继承中,类可以有构造函数、实例方法和静态方法。实例通过实例化类来创建,并且可以访问类的属性和方法。 - 经典继承使用 `extends` 关键字来创建子类,并使用 `super` 关键字来调用父类的构造函数。 区别: - 语法:原型继承使用原型链和 `prototype` 属性来实现继承,而经典继承使用类和实例化来实现继承。 - 类的定义:原型继承中没有类的概念,只有对象和原型的概念。经典继承中使用类来定义对象的结构和行为。 - 构造函数:原型继承中没有明确的构造函数的概念,而经典继承通过类的构造函数来创建对象。 - 继承方式原型继承是通过原型链来继承属性和方法,子对象直接继承父对象的原型。经典继承是通过创建类的实例来继承属性和方法,子类通过实例化父类来继承父类的属性和方法。 需要注意的是,虽然 JavaScript 中原型继承是默认和常见方式,但 ES6 引入的 `class` 关键字使得经典继承也成为了一种在 JavaScript 中实现继承关系的方式
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值