zoukankan      html  css  js  c++  java
  • 让我们纯手写一个js继承吧

    继承在前端逻辑操作中是比较常见的,今天我们就从零开始写一个js的继承方式

    es5中继承实质上是先创建子类的实例对象,然后再将父类的方法添加到this上Parent.call(this),在es6中则是先创建父类的实例对象this调用父类的super(),然后再用子类的构造函数修改this,所以无论是哪种方法必然牵扯到的操作是

    一、 以另一个对象替换当前执行对象的call方法

    Function.prototype.myCall = function() {
              let  obj = Array.from(arguments)[0] || window,
                    arg = Array.from(arguments).slice(1),
                    key = Symbol(),
                result
            obj[key] = this
            result = obj[key](...arg)
            delete obj[key]
            return result
        }

    二、创建实例对象的new方法

    function myNew(fn, arg) {
            let obj = {},
                fn = Array.from(arguments)[0],
                arg = Array.from(arguments).slice(1)
    Object.setPrototypeOf(obj, fn.prototype) fn.myCall(obj,...arg) return obj }

    完成这两步前提条件之后我们开始用自己的方法完成js继承

    function Fa(name) {
            this.name = name
        }
    Fa.prototype.set1 = function() {
            return [...this.name]
        }
    
    function Sa(name, age) {
            Fa.myCall(this,name)
            this.name = name;
            this.age = age
        }
    Sa.prototype.set2 = function() {
            return [...this.age]
        }
    Sa.prototype = myNew(Fa)
    
    Sa.prototype.constructor = Sa
    
    var qq = myNew(Sa, 123, 456)             
    qq.set1()         //  [1,2,3]

    因为es6中class的继承方式必须用new关键字来调用,所有在此不做过多描述,代码如下

    class Fa {
        constructor(name) {
            this.name = name
                }
        set() {
            return [...this.name]
                        }
            }
    class Sa extends Fa {
        constructor(name, age) {
            super(name)
            this.age = age
                    }
        }
    var dd = new Sa(123, 456)
    
    dd.set()                //[1,2,3]            
  • 相关阅读:
    Mysql其他
    Linux大全
    Django-你想知道的都在这里
    k8s
    极速安装k8s 快速融入学习
    flask orm
    Elasticsearch
    1爬虫
    MY git 操作
    docker 骚操作
  • 原文地址:https://www.cnblogs.com/GET-one/p/12249802.html
Copyright © 2011-2022 走看看