资讯专栏INFORMATION COLUMN

javascript 继承

邹立鹏 / 2425人阅读

摘要:重新挂载原型将之前的原型合并进去调用父类方法调用父类构造函数

var es = {};

es.extend = function(dist, src) {
  for (var k in src) {
    if (src.hasOwnProperty(k)) {
      dist[k] = src[k];
    }
  }
};

es.inherit = function(Klass, Base) {
  function f() {}
  f.prototype = Base.prototype;
  Klass.prototype = new f;
  Klass.prototype.constructor = Klass;
  Klass.Base = Base;
};

es.create = function(oo) {
  var Klass = oo.init;

  function realBase(fn) {
    var count = 0;
    function realBase() {
      var Base = Klass.Base, i = 0;
      while(count !== i) {
        Base = Base.Base;
        i++;
      }
      count++;
      fn.call(this, Base, arguments);
      count--;
    }
    return realBase;
  }


  oo.Base = realBase(function(Base, argv) {
    Base.apply(this, argv);
  });

  oo.oo = realBase(function(Base, argv) {
    Base.prototype[argv[0]].apply(this, [].slice.call(argv, 1));
  });


  Klass.prototype = oo;

  Klass.extend = function(Base) {
    var Klass = this;
    var old = Klass.prototype;
    es.inherit(Klass, Base);//Klass重新挂载原型
    es.extend(Klass.prototype, old); //将之前的原型合并进去
    return Klass;
  };
  
  return Klass;
};



/////////////////////test////////////////

var People = es.create({
  init: function(name) {
    this.name = name;
  },
  intro: function() {
    console.log("I am " + this.name);
  }
});

var Student = es.create({
  intro: function() {
    this.oo("intro");//调用父类方法
    console.log("I am learning " + this.lesson);
  },
  init: function(name, lesson) {
    this.Base(name);
    this.lesson = lesson;
  }
}).extend(People);



var Son = es.create({
  init: function(name, lesson, age) {
    this.Base(name, lesson);//调用父类构造函数
    this.age = age;
  },
  intro: function() {
    this.oo("intro");
    console.log("I am " + this.age + " years old");
  }
}).extend(Student);



var p = new People("eric");
p.intro();

var s = new Student("eric", "js")
s.intro();

var son = new Son("eric", "js", 34);
son.intro();

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/78772.html

相关文章

  • 彻底搞懂JavaScript中的继承

    摘要:这正是我们想要的太棒了毫不意外的,这种继承的方式被称为构造函数继承,在中是一种关键的实现的继承方法,相信你已经很好的掌握了。 你应该知道,JavaScript是一门基于原型链的语言,而我们今天的主题 -- 继承就和原型链这一概念息息相关。甚至可以说,所谓的原型链就是一条继承链。有些困惑了吗?接着看下去吧。 一、构造函数,原型属性与实例对象 要搞清楚如何在JavaScript中实现继承,...

    _ivan 评论0 收藏0
  • 讲清楚之 javascript 对象继承

    摘要:中的继承并不是明确规定的,而是通过模仿实现的。继承中的继承又称模拟类继承。将函数抽离到全局对象中,函数内部直接通过作用域链查找函数。这种范式编程是基于作用域链,与前面讲的继承是基于原型链的本质区别是属性查找方式的不同。 这一节梳理对象的继承。 我们主要使用继承来实现代码的抽象和代码的复用,在应用层实现功能的封装。 javascript 的对象继承方式真的是百花齐放,属性继承、原型继承、...

    Jonathan Shieber 评论0 收藏0
  • javascript继承 --- 多种继承方式解析(ES5)

    摘要:继承前言作为一门轻量级的脚本语言在和的横空出世之后将其推向的新的高度虽然中出现的新的生成对象的类语法格式但依然为的语法糖而我们依然有必要从的原生实现入手来了解它的继承实现方式给出了更加简洁的固定的类声明方式有兴趣的可以查看阮一峰的入门下面给 javascript继承 前言 javascript作为一门轻量级的脚本语言在ES6和node.js的横空出世之后将其推向的新的高度,虽然 ES6...

    yankeys 评论0 收藏0
  • 白话解释 Javascript 原型继承(prototype inheritance)

    摘要:我们有了构造函数之后,第二步开始使用它构造一个函数。来个例子这种方式很简单也很直接,你在构造函数的原型上定义方法,那么用该构造函数实例化出来的对象都可以通过原型继承链访问到定义在构造函数原型上的方法。 来源: 个人博客 白话解释 Javascript 原型继承(prototype inheritance) 什么是继承? 学过面向对象的同学们是否还记得,老师整天挂在嘴边的面向对象三大特...

    kid143 评论0 收藏0
  • javascript继承你了解多少?

    摘要:和构造函数前面提到,是个内置隐藏属性,虽然在可以通过访问,但是其设计本意是不可被读取和修改的,那么我们如何利用原型链来建立继承关系提供了关键字。到这儿,思路就清晰了,怎么让对象和对象的相连实现继承只需把的构造函数的连接到就行了。 什么是继承? 大多数人使用继承不外乎是为了获得这两点好处,代码的抽象和代码的复用。代码的抽象就不用说了,交通工具和汽车这类的例子数不胜数,在传统的OO语言中(...

    baishancloud 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<