• 请不要在回答技术问题时复制粘贴 AI 生成的内容
nohup
V2EX  ›  程序员

一道考察 JavaScript 的 Class 知识点的题目,难倒我了,求解

  •  
  •   nohup · Nov 13, 2018 · 3684 views
    This topic created in 2919 days ago, the information mentioned may be changed or developed.

    现有一段代码如下:

    class Parent{
       say(){
          console.log('that method called from parent method');
       }
    }
    
    class Son extends Parent{
       sayChild(){
          console.log('that method called from son method');
       }
    }
    Son son = new Son();
    son.say();
    son.sayChild();
    

    假设现在你不可以使用 extends 关键字来直接继承父类,只给你一个对象,你应该如何完成以下代码块:

    class Parent{
       say(){
          console.log('that method called from parent method');
       }
    }
    
    
    var sonObj = {
       sayChild(){
          console.log('that method called from son method');
       }
    }
    
    function getSonClassByExtends(sonObj,Parent){
    	// finish the function code and make it work
    }
    
    var Son = getSonClassByExtends(sonObj,Parent);
    Son son = new Son();
    son.say();
    son.sayChild();
    

    各位前端大佬,这道题应该如何求解,谢谢!

    15 replies  •  2018-11-14 09:27:38 +08:00
    zjsxwc
    zjsxwc
    Nov 13, 2018 via Android
    1
    方法 1: 估计是靠古老的 es5 prototype 吧,不过把 es5 与 es6 混合起来写怕是要被同事打死。

    方法 2: 使用面向对象思想,通过组合代替继承也是可行的
    zhzer
    zhzer
    Nov 13, 2018 via Android
    3
    按顺序 call 构造函数,不就完事了?
    neko2
    neko2
    Nov 13, 2018
    4
    ```javascript
    function getSonClassByExtends(sonObj,Parent){
    // finish the function code and make it work
    function son() {}
    son.prototype = sonObj;
    sonObj.__proto__ = Parent.prototype;
    return son;

    }
    ```
    msputup
    msputup
    Nov 13, 2018❤️1
    5
    是我孤陋寡闻了?什么时候有 Son son 的写法了?题目本身不难,就是 prototype 原型链的问题。但是 Son son 什么鬼?
    autoxbc
    autoxbc
    Nov 13, 2018
    6
    function getSonClassByExtends(sonObj,Parent){
    return function(){
    return Object.assign( new Parent() , sonObj );
    }
    }

    如果 work 就行那也不用搞一堆幺蛾子
    jmperdev
    jmperdev
    Nov 13, 2018
    7
    function getSonClassByExtends(sonObj,Parent){
    var F = function() {
    F.prototype = Parent.prototype;
    sonObj.prototype = new F();
    sonObj.prototype.constructor = sonObj;
    }
    }
    Biwood
    Biwood
    Nov 13, 2018
    8
    用原型链能达到目的,但是也不是标准的继承,因为你没办法做到 son.constructor === Son 返回 true 吧
    mdluo
    mdluo
    Nov 13, 2018
    9


    与其说是考察原型,不如说是考察 new 关键字
    kran
    kran
    Nov 13, 2018 via iPhone
    10
    时代的变化啊,现在很少研究原型链的了
    Sparetire
    Sparetire
    Nov 13, 2018 via Android
    11
    方法很多,因为没有涉及到 this,你甚至不用真的继承也能输出符合题目要求的结果,你只需要借用这两个方法就好了。。但是借用方法并不一定要继承。不过个人觉得是想考察原型继承和对象继承(其实都是原型继承),所以建议对 sonObj 的处理用 Object.create
    carlclone
    carlclone
    Nov 13, 2018
    12
    连我个后端都知道 prototype。。。
    spark
    spark
    Nov 13, 2018 via iPhone
    13
    Son son 是什么鬼……
    66beta
    66beta
    Nov 13, 2018
    14
    #9 楼正解
    告诉考官:class 是不推荐的写法,本来就没有类,装什么类
    kiinlam
    kiinlam
    Nov 14, 2018
    15
    Son son 那是 java 的写法了吧。
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   1841 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 44ms · UTC 15:47 · PVG 23:47 · LAX 07:47 · JFK 10:47
    ♥ Do have faith in what you're doing.