JS中通过call方法实现继承

简介: 原文:JS中通过call方法实现继承  讲解都写在注释里面了,有不对的地方请拍砖,谢谢!   JS通过call方法实现继承 /* js中的继承有多种实现方式,今天我们讨论下通过call方法实现的继承。
原文: JS中通过call方法实现继承

  讲解都写在注释里面了,有不对的地方请拍砖,谢谢!

 

<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <title>JS通过call方法实现继承</title>
</head>
<body>
    <script type="text/javascript">

        /*  js中的继承有多种实现方式,今天我们讨论下通过call方法实现的继承。
        
        此方法与 原型链继承 相比还是比较简单,容易理解的。

        那么,我们先对call方法进行简单的讲解:

        call 方法可以用一个对象来代替另一个对象调用一个方法。

        这句话蛮不好理解,

        还是看示例代码吧,更直观明了:

        */

        function a() {
            this.name = "我是a";

            this.showName = function () {
                alert(this.name);
            }
        }

        function b() {
            this.name = "我是b";
        }

        var _a = new a();
        var _b = new b();

        //下面这行代码的意思是:用 _b 来代替 _a 执行 _a 的showName方法。
        //因此执行对象从 _a 变成了 _b, showName方法里面的this此时指代的是 b 了,而不是 a
        //因此输出结果为: 我是b
        _a.showName.call(_b);

        /*
        哎,语文没学好,总感觉表达不清楚,也不知道大家能不能看懂。
        好了,进入正题,我们来看继承的实现。
        */


        /*
        首先我们要定义4个类:动物(animal) ; 人(person) ; 中国人(chinese) ; 日本人(japanese)。

        代码如下:
        */

        function animal() {
            this.eat = function () {
                alert("动物都要吃东西");
            }
        }

        function person() {
            this.say = function () {
                alert("人是会说话的");
            }
        }

//        function chinese() {
//            this.ch = function () {
//                alert("我是中国人");
//            }
//        }

//        function japanese() {
//            this.ja = function () {
//                alert("我是日本人");
//            }
//        }


        /*  然后实现4个类之间的关系
            
            关系如下: 中国人 继承自 人

                      日本人 继承自 动物 和 人

            说明: 
            
            在JS中是可以实现类的多继承的。
            因此 japanese 可以同时继承自 animal 和 person ,
            它不像C#和java语言,只支持接口的多继承,而不支持类的多继承。
            

            修改上面的chinese和japanese如下:
        
        */


        function chinese() {
            person.call(this); //继承自 person 类 (用chinese来代替person)

            this.ch = function () {
                alert("我是中国人");
            }
        }


        function japanese() {
            animal.call(this); //继承自 animal 类
            person.call(this); //继承自 person 类

            this.ja = function () {
                alert("我是日本人");
            }
        }


        /*
            我们知道:实现继承后,子类是可以拥有父类的公有字段和方法的。
            而父类不会拥有子类的任何东西

            说明:
            js中的 字段,方法 也是有公有和私有之分的。
            子类只能访问到父类的公有字段和方法。           
            关于 js 中的 公有,私有,全局,静态 等等的定义讲解我会另写一篇博文
            与大家讨论。

            请看如下代码:
        */

        //实例化对象
        var c = new chinese();
        var j = new japanese();
        var p = new person();

        c.say(); //拥有父类 person 的 say 方法
        c.ch();  //自身的 ch 方法

        j.eat();  //拥有父类 animal 的 eat 方法
        j.say();  //拥有父类 person 的 say 方法
        j.ja();   //自身的 ja 方法

        p.say();  //自身的 say 方法

        /*
            下面两句会报错,
            因为父类person是不会拥有子类的任何东西的,
            所以p没有ch和ja方法。

            p.ch();
            p.ja();
        */

    </script>
</body>
</html>

 

     

目录
相关文章
|
12天前
|
存储 JavaScript 索引
JS中数组的相关方法介绍
JS中数组的相关方法介绍
|
14天前
|
JavaScript 前端开发 容器
AJAX载入外部JS文件到页面并让其执行的方法(附源码)
AJAX载入外部JS文件到页面并让其执行的方法(附源码)
16 0
|
15天前
|
JSON JavaScript 前端开发
JavaScript原生代码处理JSON的一些高频次方法合集
JavaScript原生代码处理JSON的一些高频次方法合集
|
JavaScript 前端开发 Java
深入JS面向对象(原型-继承)(一)
深入JS面向对象(原型-继承)
30 0
|
1月前
|
JavaScript 前端开发
js开发:请解释原型继承和类继承的区别。
JavaScript中的原型继承和类继承用于共享对象属性和方法。原型继承利用原型链查找属性,节省内存但不支持私有成员。类继承通过ES6的class和extends实现,支持私有成员但占用更多内存。两者各有优势,适用于不同场景。
18 0
|
1月前
|
JavaScript 前端开发
解释 JavaScript 中的`map()`、`filter()`和`reduce()`方法的用途。
解释 JavaScript 中的`map()`、`filter()`和`reduce()`方法的用途。
19 1
|
12天前
|
JavaScript 前端开发 索引
JavaScript中与字符串相关的方法
JavaScript中与字符串相关的方法
|
1月前
|
JavaScript
JS数组增删方法的原理,使用原型定义
JS数组增删方法的原理,使用原型定义
|
6天前
|
JavaScript 前端开发 Java
js 垃圾回收机制的方法
js 垃圾回收机制的方法
|
6天前
|
JavaScript 前端开发
js数据类型有几类?一共有几种?判断数据类型的方法是什么?
js数据类型有几类?一共有几种?判断数据类型的方法是什么?