在多数语言中继承都很重要。JavaScript是一个基于原型的语言,这意味着对象可以直接从其他对象继承。以下列出几种常见的js继承方式。

  1. 原型链继承

    function Father(){
    this.status = true;
    }
    Father.prototype.getSuper = function(){
    return this.status;
    };
    function Son(){
    this.substatus = false;
    }
    //继承了 SuperType
    Son.prototype = new Father();
    Son.prototype.getSub = function (){
    return this.substatus;
    };
    var instance = new Son();
    alert(instance.getSuper()); //true
  2. 借用构造函数继承
    function Father(){
    this.colors = [1,2,3];
    }
    function Son(){
    //继承了 Father
    Father.call(this);
    }
    var instance1 = new Son();
    instance1.colors.push(4);
    alert(instance1.colors); //"1,2,3,4"
    var instance2 = new Son();
    alert(instance2.colors); //"1,2,3"
  3. 组合继承
    function Father(name){
    this.name = name;
    }
    Father.prototype.sayName = function(){
    alert(this.name);
    };
    function Son(name, age){
    //继承属性
    SuperType.call(this, name);
    this.age = age;
    } Son.prototype = new Father(); //将子类的原型指向父类
    Son.prototype.constructor = Son; //将子类的constructor指向自己
    Son.prototype.sayAge = function(){
    alert(this.age);
    };
    var instance = new Son("lh", 19);
    instance1.sayName(); //"lh";
    instance1.sayAge(); //19
  4. 原型式继承
    function object(o){
    function F(){}
    F.prototype = o;
    return new F();
    }
    var person = {
    name: "lh",
    loves: ["a", "b", "c"]
    };
    var anotherPerson = object(person);
    anotherPerson.name = "Greg";
    anotherPerson.friends.push("d");
    alert(person.loves); //"a,b,c,d"

    这里的object方法和Object.create()方法类似。

  5. 寄生式继承
    function object(o){
    function F(){}
    F.prototype = o;
    return new F();
    }
    function createAnother(obj){
    var clone = object(obj); //通过调用函数创建一个新对象
    clone.say = function(){ //给这个对象添加方法
    alert("hi");
    };
    return clone; //返回这个对象
    }
    var person = {
    name: "lh",
    loves: ["a", "b", "c"]
    };
    var anotherPerson = createAnother(person);
    anotherPerson.say(); //"hi"
  6. 寄生组合式继承
    function inheritPrototype(son, father){
    var prototype = Object.create(father.prototype);
    son.prototype = prototype;
      prototype.constructor = son;
    }
    function Father(name){
    this.name = name;
    }
    Father.prototype.sayName = function(){
    alert(this.name);
    };
    function Son(name, age){
    Father.call(this, name);
    this.age = age;
    }
    inheritPrototype(Son, Father);
  7. 使用es6实现
    class Father{
    constructor(x, y) {
    this.x = x;
    this.y = y;
    }
    }
    class son extends Father{
    constructor(x, y, age) {
    super(x, y); // 调用父类的constructor(x, y)
    this.age= age;
    }
    toString() {
    return this.color + ' ' + super.toString(); // 调用父类的toString()
    }
    }
    子类继承父类中constructor中必须先调用super()方法才能访问this,否则会报错。

原生js实现继承的更多相关文章

  1. koa 基础(十七)原生 JS 中的类、静态方法、继承

    1.app.js /** * 原生 JS 中的类.静态方法.继承 * es5中的类和静态方法 */ function Person(name, age) { // 构造函数里面的方法和属性 this. ...

  2. 用原生JS读写CSS样式的方法总结

    为了日后方便查询,本人翻阅了一些资料总结了以下方法,仅限原生JS,如有不对的地方欢迎指出!只求大家看完觉得有学到点什么就OK了!   一.可以通过DOM节点对象的style对象(即CSSStyleDe ...

  3. 框架操作DOM和原生js操作DOM比较

    问题引出 对于Angular和React操作DOM的速度,和原生js操作DOM的速度进行了一个比较: 一个同学做的demo 代码如下: <!DOCTYPE html> <html n ...

  4. 原生js dom记忆的内容

    1.DOM基础getElementByIdgetElementByTagNamegetElementByName getElementsByClass querySelector querySelec ...

  5. 原生JS面向对象思想封装轮播图组件

    原生JS面向对象思想封装轮播图组件 在前端页面开发过程中,页面中的轮播图特效很常见,因此我就想封装一个自己的原生JS的轮播图组件.有了这个需求就开始着手准备了,代码当然是以简洁为目标,轮播图的各个功能 ...

  6. 原生js+css实现重力模拟弹跳系统的登录页面

    今天小颖把之前保存的js特效视频看了一遍,跟着视频敲了敲嘻嘻,用原生js实现一个炫酷的登录页面.怎么个炫酷法呢,看看下面的图片大家就知道啦. 效果图: 不过在看代码之前呢,大家先和小颖看看css中的o ...

  7. 原生Js操作DOM

    查找DOM .querySelectorAll(),它接受包含一个CSS选择器的字符串参数,返回一个表示文档中匹配选择器的所有元素的NodeList元素. .querySelector(),返回第一个 ...

  8. 原生JS插件(超详细)

    作为一个前端er,如果不会写一个小插件,都不好意思说自己是混前端界的.写还不能依赖jquery之类的工具库,否则装得不够高端.那么,如何才能装起来让自己看起来逼格更高呢?当然是利用js纯原生的写法啦. ...

  9. 原生js实现vue组件功能

    在如今VUE盛行的情况下,我们一直在惊叹于VUE的组件的功能,却不知道,原生js早就已经支持了这个功能. 最近在公开课学到的,js还有很多很多需要探索学习. 下面是一个简单的例子 <!DOCTY ...

随机推荐

  1. Tomcat的原理

    Tomcat是一种WEB容器:它主要实现了javaEE中Servlet.JSP规范,同时提供HTTP服务. 它主要由一个Serve服务器,Server服务器中存在多个Service服务,Service ...

  2. 2016中国银行Top100榜单发布 工行排首位

    2016中国银行Top100榜单发布 工行排首位 2016-07-09 15:13:19 第一财经   2016年7月8日,中国银行业协会在京召开“<中国银行业发展报告(2016)>发布会 ...

  3. 【JZOJ4847】【NOIP2016提高A组集训第5场11.2】夕阳

    题目描述 "我有个愿望,我希望在灿烂千阳时遇见你." 这是个有n个点的世界,有m条无向边连接着这n个点,但是不保证点之间能够互相到达. "这个世界的夕阳,只在奇数长的简单 ...

  4. Chef 安装

    http://www.tuicool.com/articles/RnAVn2 三个角色: chef server, chef workstation, chef nodes(chef clients) ...

  5. 2019-4-7-VisualStudio-解决方案筛选器-slnf-文件

    title author date CreateTime categories VisualStudio 解决方案筛选器 slnf 文件 lindexi 2019-04-07 11:34:59 +08 ...

  6. phpexcel使用说明1

    <?php /** * PHPEXCEL生成excel文件 * @author:firmy * @desc 支持任意行列数据生成excel文件,暂未添加单元格样式和对齐 */ require_o ...

  7. C#中的字段,常量,属性与方法

    以前是学C++的,初次学微软的C#头都大了.什么字段,常量,属性,方法......微软把别人的东西拿来糅合在C#里,弄成了一个“大杂烩”.其实,说到底,“字段”不就是“变量”吗,所谓的“方法”不就是“ ...

  8. 关于Spring+mybatis+PageHelper分页插件PageHelper的使用策略

    把插件jar包导入项目(具体上篇有介绍http://blog.csdn.net/qq_33624284/article/details/72821811) spring-mybatis.xml文件中配 ...

  9. Java练习 SDUT-1184_拍皮球

    C语言实验--拍皮球 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 小瑜3岁了,很喜欢玩皮球,看来今后喜欢打篮球的^_ ...

  10. lattice planner 规划详解

    大家好,我是来自百度智能驾驶事业群的许珂诚.今天很高兴能给大家分享Apollo 3.0新发布的Lattice规划算法. Lattice算法隶属于规划模块.规划模块以预测模块.routing模块.高精地 ...