首页 > 代码库 > 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>

 

     

JS中通过call方法实现继承