zoukankan      html  css  js  c++  java
  • 失败的尝试,使用继承扩展数组,以及ES6的必要性

    我们都知道直接在原生对象上扩展对象是很不好的。所以prototype这样的库广受非议。

    一些库,比如lodash采用了工具包形式的扩展方式,绕开了对象的继承。

    由于es6的class的出现,我尝试以Array派生子对象的方式进行扩展。

    以下是一个简单的例子。

    "use strict"
    class Abc extends Array{
      getarray(){
        return this;
      }
    }
    let x=new Abc(5).fill(1);
    console.log(x.getarray());

    在v8中,这个例子是会输出正确结果[1,1,1,1,1]的。

    尔后为了兼容其它浏览器,我尝试使用babel.js转码为es5。

    但是这一步无论怎么样都没有成功。

    最后我进入babel的官方讨论组才知道这是不被支持的。

    loganfsmyth给出一个写法

    class ExtendableArray {
        constructor(...args){
            const arr = new Array(...args);
            Object.setPrototypeOf(arr, this.constructor.prototype);
            return arr;
        }
    }

    但是很显然,instanceof 以及Array.isArray 等语句都会有问题。

    因此,现阶段并不存在完美的替代方案。

    很多人都说,es6中的很多东西是语法糖。

    不错,确实如此。

    但是作为脚本语言,越精炼的脚本,扫描速度就会更快,压缩器的性能潜力也会提升。

    冗长的语法从来就没有实质的意义,需要的,更多是书写形式的工整。

    es6的诸多特性大多对这几点都有帮助。

    模块的出现统一了目前繁杂的加载方式。

    一系列异步语句的提出解决了回调地狱。

    类的提出简化了继承过程。

    更多的基础数据结构优化了数据处理性能。

    虽然如果不考虑效率,es6能做到的,es5大多也能做到。

    但是es5并不能做的更好。

    程序,必须是优美的。

  • 相关阅读:
    Linux 安装中文man手册
    centos6.9使用NTFS-3G挂载ntfs文件系统
    Linux基础知识之挂载详解(mount,umount及开机自动挂载)
    技术点总结
    SQL 分组后获取其中一个字段最大值的整条记录 【转载】
    线程池之ThreadPool类与辅助线程
    Task.Run使用默认线程池
    VS生成事件
    线程池之ThreadPoolExecutor使用
    Sql笔记
  • 原文地址:https://www.cnblogs.com/XmodYgetZ/p/5007565.html
Copyright © 2011-2022 走看看