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>

 

     

目录
相关文章
|
1月前
|
监控 负载均衡 JavaScript
有哪些有效的方法可以优化Node.js应用的性能?
有哪些有效的方法可以优化Node.js应用的性能?
162 69
|
9天前
|
JavaScript Linux 内存技术
Debian 11系统下Node.js版本更新方法详解
本指南详细介绍在Linux系统中安装和管理Node.js的步骤。首先检查现有环境,包括查看当前版本和清除旧版本;接着通过NodeSource仓库安装最新版Node.js并验证安装结果。推荐使用nvm(Node Version Manager)进行多版本管理,便于切换和设置默认版本。同时,提供常见问题解决方法,如权限错误处理和全局模块迁移方案,以及版本回滚操作,确保用户能够灵活应对不同需求。
58 0
|
9天前
|
JavaScript Linux 内存技术
Debian 11系统下Node.js版本更新方法
Debian 11更新Node.js主要就是这三种方式,无论你是初涉其中的新手还是找寻挑战的专家,总有一种方式能满足你的需求。现在,你已经是这个
74 23
|
7月前
|
JavaScript 前端开发
如何在 JavaScript 中使用 __proto__ 实现对象的继承?
使用`__proto__`实现对象继承时需要注意原型链的完整性和属性方法的正确继承,避免出现意外的行为和错误。同时,在现代JavaScript中,也可以使用`class`和`extends`关键字来实现更简洁和直观的继承语法,但理解基于`__proto__`的继承方式对于深入理解JavaScript的面向对象编程和原型链机制仍然具有重要意义。
|
7月前
|
JavaScript 前端开发 程序员
前端原生Js批量修改页面元素属性的2个方法
原生 Js 的 getElementsByClassName 和 querySelectorAll 都能获取批量的页面元素,但是它们之间有些细微的差别,稍不注意,就很容易弄错!
137 1
|
4月前
|
前端开发 JavaScript
有没有方法可以保证在JavaScript中多个异步操作的执行顺序?
有没有方法可以保证在JavaScript中多个异步操作的执行顺序?
128 58
|
2月前
|
JavaScript 前端开发 Java
js 垃圾回收机制的方法
JS回收机制方法讲解
|
3月前
|
JavaScript 前端开发 Java
深入理解 JavaScript 中的 Array.find() 方法:原理、性能优势与实用案例详解
Array.find() 是 JavaScript 数组方法中一个非常实用和强大的工具。它不仅提供了简洁的查找操作,还具有性能上的独特优势:返回的引用能够直接影响原数组的数据内容,使得数据更新更加高效。通过各种场景的展示,我们可以看到 Array.find() 在更新、条件查找和嵌套结构查找等场景中的广泛应用。 在实际开发中,掌握 Array.find() 的特性和使用技巧,可以让代码更加简洁高效,特别是在需要直接修改原数据内容的情形。 只有锻炼思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一
|
3月前
|
移动开发 运维 供应链
通过array.some()实现权限检查、表单验证、库存管理、内容审查和数据处理;js数组元素检查的方法,some()的使用详解,array.some与array.every的区别(附实际应用代码)
array.some()可以用来权限检查、表单验证、库存管理、内容审查和数据处理等数据校验工作,核心在于利用其短路机制,速度更快,节约性能。 博客不应该只有代码和解决方案,重点应该在于给出解决方案的同时分享思维模式,只有思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
|
3月前
|
供应链 JavaScript 前端开发
通过array.every()实现数据验证、权限检查和一致性检查;js数组元素检查的方法,every()的使用详解,array.some与array.every的区别(附实际应用代码)
array.every()可以用来数据验证、权限检查、一致性检查等数据校验工作,核心在于利用其短路机制,速度更快,节约性能。 博客不应该只有代码和解决方案,重点应该在于给出解决方案的同时分享思维模式,只有思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~