Javascript 面向对象(ES5继承)

ES5继承

在ES5中继承是通过原型链来继承的。

我们都知道每个构造函数都有有一个原型对象,原型对象都包含一个指向构造函数的指针,而是列都包含一个指向原型对象的指针。

        function DaGe() {
            this.type = 'Da Ge'
            this.beat = ()=>{
                console.log('Da Ge Hao')
            }
        }
        DaGe.prototype.bart = function () {
            return this.type;
        }

        function ErGe() {
            this.type = 'Er Ge'
            
        }
        ErGe.prototype.bart2 = function () {
            return this.type;
        }

        ErGe.prototype = new DaGe();
       
        const instance = new ErGe();

        console.log(instance.bart()); // 继承prototype返回type因为ErGe里有type所以为Er Ge
        console.log(instance.beat()); // 继承prototype返回type因为ErGe里没有beat()所以为Da Ge Hao
        console.log(instance.bart2()); // 报错因为此时指向DaGe并没有指向ErGe所以bart2并没有

上面的代码看似没有问题其实还是有一个不容易发现的问题。

当我们来判断prototype对象的constructor属性时出现了问题。

//在const instance = new ErGe(); 后添加
console.log(ErGe.prototype.constructor === DaGe) // true 

//因为已经继承了所以constructor指向了DaGe但是是有问题的

// 明明instance是通过构造函数ErGe生成的
所以我们必须在每一次替换了prototype对象

//我们要重新指回原构造函数
ErGe.prototype.constructor  = ErGe; 

最终代码如下

 function DaGe() {
            this.type = 'Da Ge'
            this.beat = ()=>{
                console.log('Da Ge Hao')
            }
        }
        DaGe.prototype.bart = function () {
            return this.type;
        }

        function ErGe() {
            this.type = 'Er Ge'
            
        }
        ErGe.prototype.bart2 = function () {
            return this.type;
        }

        ErGe.prototype = new DaGe();
        ErGe.prototype.constructor  = ErGe; 
        const instance = new ErGe();
        console.log(ErGe.prototype.constructor === DaGe) // true
        console.log(instance.bart()); // 继承prototype返回type因为ErGe里有type所以为Er Ge
        console.log(instance.beat()); // 继承prototype返回type因为ErGe里没有beat()所以为Da Ge Hao
        console.log(instance.bart2()); // 报错因为此时指向DaGe并没有指向ErGe所以bart2并没有
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  •   面向对象(Object-Oriented,OO)的语言有一个标志,那就是它们都有类的概念,而通过类可以创建任意...
    霜天晓阅读 2,139评论 0 6
  • 第3章 基本概念 3.1 语法 3.2 关键字和保留字 3.3 变量 3.4 数据类型 5种简单数据类型:Unde...
    RickCole阅读 5,149评论 0 21
  • 面向对象的语言有一个标志,那就是它们都有类的概念,而通过类可以创建任意多个具有相同属性和方法的对象。ECMAScr...
    DHFE阅读 997评论 0 4
  • 博客内容:什么是面向对象为什么要面向对象面向对象编程的特性和原则理解对象属性创建对象继承 什么是面向对象 面向对象...
    _Dot912阅读 1,447评论 3 12
  • JavaScript面向对象程序设计 本文会碰到的知识点:原型、原型链、函数对象、普通对象、继承 读完本文,可以学...
    moyi_gg阅读 771评论 0 2