`
babysuperman
  • 浏览: 1956 次
  • 性别: Icon_minigender_1
  • 来自: 北京
最近访客 更多访客>>
社区版块
存档分类
最新评论

前端面试题—— JavaScript模拟类式继承

 
阅读更多

前端面试题系列—— JavaScript模拟类式继承

 

类式继承的需求

 

SuperClass是父类,SubClass是子类。我们需要达到的效果是,子类继承父类公有的属性和方法,方法依然为子类公有,子类继承父类的实例属性和方法,属性为子类各个实例自己的。举个栗子:

 

    function SuperClass( name ) {
        this.name = name;
    }

    SuperClass.prototype.sayName = function () {
        alert ( this.name );
    }

    function SubClass() {}

    inheritClass( SubClass, SuperClass );// inheritClass 是将要实现的类式继承操作

    var sub1 = new SubClass( 'jack' );

    var sub2 = new SubClass( 'king' );

    alert( sub1.name == 'jack' );// 期待返回true

    alert( sub2.name == 'king' );//期待返回true
    
    sub1.sayName(); //期待 alert( 'jack' )

 

 

  inheritClass( SubClass, SuperClass )该如何实现呢,首先继承原型链:

 

 

    function SuperClass( name ) {
        this.name = name;
    }

    SuperClass.prototype.sayName = function () {
        return this.name;
    }

    function SubClass() {}

    SubClass.prototype = new SuperClass();// 形成原型链

    var sub1 = new SubClass( 'jack' );

    var sub2 = new SubClass( 'king' );

    alert( sub1.name == 'jack' );// 期待返回flase;
    alert( sub1.name ); //'jack'

    alert( sub2.name == 'king' );//期待返回true;

    sub1.sayName(); //alert(' jack' );

 

可见name并不是每个实例自己的,实际上是子类公有的,在SubClass.prototyp.name上得到的,那如何改进呢,继续往下看:

 

    function SuperClass( name ) {
        this.name = name;
    }

    SuperClass.prototype.sayName = function () {
        return this.name;
    }

    function SubClass() {
        SuperClass.apply( this, arguments );  
    }

    SubClass.prototype = new SuperClass();// 形成原型链

    var sub1 = new SubClass( 'jack' );

    var sub2 = new SubClass( 'king' );

    alert( sub1.name == 'jack' );// true;

    alert( sub2.name == 'king' );//true;

    sub1.sayName(); //alert(' jack' );

 

我们利用apply来实现了该功能,但是SuperClass.prototyp.name依然存在,如果属性比较多的话是很大的浪费。如何继续改进呢,问题出在SubClass.prototype = new SuperClass();这个语句上,我们需要这里仅仅执行公有的方法和属性继承的操作。我们可以借用构造函数来完成这个任务:

 

    function SuperClass( name ) {
        this.name = name;
    }

    SuperClass.prototype.sayName = function () {
        return this.name;
    }

    function SubClass() {
        SuperClass.apply(this, arguments);
    }

    function prototypeInherit( o ) {
        function F(){};
        F.prototype = o;
        return new F();
    }

    function inheritClass( SubClass, SuperClass ) {
        var prototype = prototypeInherit( SuperClass.prototype );
        prototype.constructor = SubClass;
        SubClass.prototype = prototype;
    }

    inheritClass( SubClass, SuperClass );// inheritClass 是将要实现的类式继承操作

    var sub1 = new SubClass( 'jack' );

    var sub2 = new SubClass( 'king' );

    alert( sub1.name == 'jack' );//true

    alert( sub2.name == 'king' );//true

    alert( sub1.sayName() );//'jack'

    alert( sub1.constructor.name );

 

分析下两个函数:inheritClass的核心是构造一个SubClass.prototype:prototypeInherit( o )利用了一个公的构造函数F使得实例的属性和方法不会传到子类的prototype上。inheritClass( SubClass, SuperClass )需要做的是将prototype的constructor修正为SubClass,之前为SuperClass。小作业:想想之前为什么是SuperClass?

 

 

 

分享到:
评论

相关推荐

    2022前端面试系列——Vue面试题.pdf

    Vue面试题知识点总结 本文总结了Vue面试题中的知识点,涵盖了Vue的基本原理、双向数据绑定的原理、MVVM、MVC、MVP的区别等内容。 1. Vue的基本原理 Vue实例的创建过程中,Vue会遍历data中的属性,并使用Object....

    前端面试题:前端框架面试题大全

    前端面试题:前端框架面试题大全; 前端面试题:前端框架面试题大全; 前端面试题:前端框架面试题大全; 前端面试题:前端框架面试题大全; 前端面试题:前端框架面试题大全; 前端面试题:前端框架面试题大全; ...

    java面试真题-江苏骏环昇旺科技.jpg

    java面试真题——江苏骏环昇旺科技.jpgjava面试真题——江苏骏环昇旺科技.jpgjava面试真题——江苏骏环昇旺科技.jpgjava面试真题——江苏骏环昇旺科技.jpgjava面试真题——江苏骏环昇旺科技.jpgjava面试真题——江苏...

    前端面试题之JavaScript相关题集.zip

    前端面试题 前端面试题之JavaScript相关题集

    前端面试题汇总前端面试题汇总前端面试题汇总

    前端面试题汇总前端面试题汇总前端面试题汇总前端面试题汇总前端面试题汇总前端面试题汇总前端面试题汇总前端面试题汇总前端面试题汇总前端面试题汇总前端面试题汇总前端面试题汇总前端面试题汇总前端面试题汇总前端...

    2017前端面试题整理汇总

    2017年,随着Web技术的快速发展,前端面试题也日益多元化,涵盖了JavaScript、HTML、CSS等核心领域的深度和广度。这份"2017前端面试题整理汇总"旨在为求职者提供一个全面了解前端面试趋势和必备技能的平台。 1. **...

    银行面试真题——客户经理.pdf

    这是因为给出的文件信息中,标题为“银行面试真题——客户经理.pdf”,描述与标题相同,均为“银行面试真题——客户经理.pdf”,而标签部分为空。接着,您提供的部分内容是一串数字和符号,没有实际的文字内容,因此...

    最全面的java面试题——选择题部分

    最全面的java面试题——选择题部分

    H5前端面试大全-包含大厂面试题_25个md文件分类面试题.rar

    15.md 各大互联网公司2014前端笔试面试题–JavaScript篇 JavaScript 16.md 2014年最新前端开发面试题 General 17.md 前端面试资源汇总 General 18.md 5个典型的JavaScript面试题(上) JavaScript 19.md 再来5个...

    「2021」高频前端面试题汇总之JavaScript篇.pdf

    「2021」高频前端面试题汇总之JavaScript篇

    2021前端面试题.pdf

    前端面试题总结

    面试题练习题前端 JavaScript高级语法-字符串属性

    面试题练习题前端 JavaScript高级语法-字符串属性面试题练习题前端 JavaScript高级语法-字符串属性面试题练习题前端 JavaScript高级语法-字符串属性面试题练习题前端 JavaScript高级语法-字符串属性面试题练习题前端...

    前端面试题含答案.pdf

    前端面试题含答案.pdf 前端面试题含答案.pdf 是一份包含多个与前端开发相关的问题的文件,该文件涵盖了 HTML、CSS、JavaScript 等多个方面的知识点。下面是对该文件中部分内容的知识点解释: 1. CSS 样式定义:...

    前端面试题汇总.pdf

    前端面试题汇总主要涵盖HTML和CSS相关的重要知识点,旨在考察面试者对于网页构建的基础知识、浏览器兼容性、页面性能优化以及SEO策略等的理解。以下是对这些面试题的详细解析: 1. **浏览器测试**:面试者应熟悉...

    2023最新前端面试题总结

    "前端面试题总结" 以下是根据给定文件信息生成的相关知识点: 浏览器兼容性 在前端开发中,浏览器兼容性是一个非常重要的问题。不同的浏览器对 HTML、CSS、JavaScript 的解析和执行方式不同,这导致了同一个页面...

    java程序员面试题——863面试集

    ### Java程序员面试题详解 #### 一、Java基础知识 1. **作用域public, private, protected, 以及不写时的区别** - **public**: 可以被任何类访问。 - **protected**: 可以被同一包内及不同包内的子类访问。 - ...

    世界500强面试题——让你在面试时更有自信

    世界500强面试题——让你在面试时更有自信!

    2020年前端面试真题(阿里、网易、滴滴等)文件为百度网盘链接永久有效

    现在五块钱的付出,将来收获的可能是一份心仪的offer,干货满满,建议下载。...友情提示:本套面试题包括面试题900题+公司实战面试题400问,面试题已经整理好答案,公司题由于新收录没有答案,但非常有参考价值。

    前端面试题,JavaScript,html+css,Vue,react,小程序

    在前端开发领域,JavaScript、HTML+CSS、Vue、React以及小程序是不可或缺的技术栈。这些技术在构建现代Web应用中扮演着重要角色。...准备充分的前端面试者通常能更好地适应快速变化的Web开发环境。

    Java全能学习面试手册——互联网企业面试真题.zip

    Java全能学习面试手册——互联网企业面试真题.zip 01 java面试——北京-百度-Java中级.pdf 02 java面试——北京-京东-Java中级.pdf 03 java面试——广州-唯品会-Java大数据开发工程师.pdf 04 java面试——杭州-阿里...

Global site tag (gtag.js) - Google Analytics