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并不能做的更好。

    程序,必须是优美的。

  • 相关阅读:
    拾回被剥削的自由,未来实实在在的弹性工作一定成为主流
    探索RequestBody报com.alibaba.fastjson.JSONObject cannot be cast to xxx
    CSM与UEFI
    JS使用onscroll、scrollTop实现图片懒加载
    点击button后刷新了页面
    jQuery中prop和attr区别
    encodeURI、encodeURIComponent
    局中人
    年轻人能为世界做些什么
    JavaWeb中的资源映射
  • 原文地址:https://www.cnblogs.com/XmodYgetZ/p/5007565.html
Copyright © 2011-2022 走看看