首页   注册   登录
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX  ›  程序员

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

  •  
  •   nohup · 284 天前 · 1726 次点击
    这是一个创建于 284 天前的主题,其中的信息可能已经有所发展或是发生改变。

    现有一段代码如下:

    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 回复  |  直到 2018-11-14 09:27:38 +08:00
        1
    zjsxwc   284 天前 via Android
    方法 1: 估计是靠古老的 es5 prototype 吧,不过把 es5 与 es6 混合起来写怕是要被同事打死。

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

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

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


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