ES5 构造函数与ES6 Class的区别

这篇具有很好参考价值的文章主要介绍了ES5 构造函数与ES6 Class的区别。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

  • Class 类中不存在变量提升
    // es5
        var bar  = new Bar(); // 可行
        function Bar() {
            this.bar = 42;
        }
    
    //es6
        const foo = new Foo(); // Uncaught ReferenceError
        class Foo {
            constructor() {
                this.foo = 42;
            }
        }
  • class内部会启用严格模式
    // es5
   function Bar() {
       // 引用一个未声明的变量
       baz = 42; // it's ok
   }
   var bar  = new Bar(); 

   // es6
   class Foo {
       constructor(){
           // 引入一个未声明的变量
           fol = 42;// Uncaught ReferenceError: fol is not defined
       }
   }
   let foo = new Foo();
  • class的所有方法都是不可枚举的
  // es5
  function Bar() {}   
  Bar.answer = function () {};
  Bar.prototype.print = function () {};
  console.log(Object.keys(Bar));// ["answer"]
  console.log(Object.keys(Bar.prototype))// ["print"]
  // es6
  class Foo {
      constructor(){}
      static answer() {}
      print(){}
  }
  console.log(Object.keys(Foo))// []
  console.log(Object.keys(Foo.prototype));// []
  • class 必须使用new调用
 // es5
    function Bar(){ }
    var bar = Bar();// it's ok;
    // es6
    class Foo {

    }
    let foo = Foo();// Uncaught TypeError: Class constructor Foo cannot be invoked without 'new'
  • class 内部无法重写类名
 // es5 
    function Bar() {
        Bar = 'Baz';
        this.bar = 42;
    }
    var bar = new Bar();
    console.log(bar);// Bar {bar: 42}
    console.log(Bar);// 'Baz'

    // es6
    class Foo {
        constructor(){
            this.foo = 42;
            Foo = 'Fol'; // Uncaught TypeError: Assignment to constant variable.
        }
    }
    let foo = new Foo();
    Foo = 'Fol';// it's ok
  • class 的继承有两条继承链

一条是: 子类的__proto__ 指向父类

另一条: 子类prototype属性的__proto__属性指向父类的prototype属性.

es6的子类可以通过__proto__属性找到父类,而es5的子类通过__proto__找到Function.prototype

    // es5
    function Super() {}
    function Sub() {}
    Sub.prototype = new  Super();
    Sub.prototype.constructor = Sub;
    var sub = new Sub();
    console.log( Sub.__proto__ === Function.prototype);// true

    // es6
    class Super{}
    class Sub extends Super {}
    let sub = new Sub();
    console.log( Sub.__proto__ === Super);// true
  • es5 与 es6子类this的生成顺序不同。

es5的继承是先建立子类实例对象this,再调用父类的构造函数修饰子类实例(Surper.apply(this))。

es6的继承是先建立父类实例对象this,再调用子类的构造函数修饰this。即在子类的constructor方法中必须使用super(),之后才能使用this,如果不调用super方法,子类就得不到this对象。文章来源地址https://www.toymoban.com/news/detail-462718.html

  • 正是因为this的生成顺序不同,所有es5不能继承原生的构造函数,而es6可以继承
      // es5
      function MyES5Array() {
          Array.apply(this, arguments);
          // 原生构造函数会忽略apply方法传入的this,即this无法绑定,先生成的子类实例,拿不到原生构造函数的内部属性。
      }
      MyES5Array.prototype = Object.create(Array.prototype, {
          constructor: {
              value: MyES5Array,
              writable: true,
              configurable: true,
              enumerable: true
    
          }
      })
      var arrayES5 = new MyES5Array();
      arrayES5[0] = 3;
      console.log(arrayES5.length);// 0 
      arrayES5.length = 0;
      console.log(arrayES5[0]);// 3
    
      // es6
      class arrayES6 extends Array {
          constructor(...args){
              super(...args);
          }
      }
      let arrayes6 = new arrayES6();
      arrayes6[0] = 3;
      console.log(arrayes6.length);// 1
      arrayes6.length = 0;
      console.log(arrayes6[0]);// undefined

到了这里,关于ES5 构造函数与ES6 Class的区别的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 谈谈ES5和ES6的区别

    我们都知道JavaScript是由三部分组成: 1. ECMAScript(核心):规定了语言的组成部分=语法、类型、语句、、保留字、操作符、对象 2. BOM(浏览器对象模型): 支持访问和操作浏览器窗口,可以控制浏览器显示页面以外的部分。 3. DOM(文档对象模型): 把整个页面映射为一个多层节

    2024年02月02日
    浏览(39)
  • this在Es5和Es6的区别

    在ES5和ES6中,this的指向有所不同。 在ES5中,this的默认指向是全局对象(在浏览器环境中通常是window对象)。在函数中,this的指向取决于函数的调用方式。例如,在方法调用中,this指向调用该方法的对象;在构造函数中,this指向构造出来的新对象;在定时器或事件处理函数

    2024年01月19日
    浏览(37)
  • JavaScript、TypeScript、ES5、ES6之间的联系和区别

    ECMAScript:  一个由 ECMA International 进行标准化,TC39 委员会进行监督的语言。通常用于指代标准本身。 JavaScript:  ECMAScript 标准的各种实现的最常用称呼。这个术语并不局限于某个特定版本的 ECMAScript 规范,并且可能被用于任何不同程度的任意版本的 ECMAScript 的实现。 ECMAS

    2024年02月13日
    浏览(40)
  • js继承的几种方式(原型链继承、构造函数继承、组合式继承、寄生组合式继承、ES6的Class类继承)

    实现原理: 子类的原型指向父类实例 。子类在自身实例上找不到属性和方法时去它父类实例(父类实例和实例的原型对象)上查找,从而实现对父类属性和方法的继承 缺点: 子类创建时不能传参(即没有实现super()的功能); 父类实例的修改会影响子类所有实例 实现原理:

    2024年02月07日
    浏览(45)
  • 【chatGTP 对es6与es5的区别是什么的解析】

    笔者对chatGPT做了一些提问其结果另人印象深刻,这回答要比一些博主的文章要精彩的多,机器取代人工写作看样子是时间问题了 ES6 (ECMAScript 2015) 和 ES5 (ECMAScript 5) 是 JavaScript 的两个主要版本,它们之间有很多区别。 以下是 ES6 相对于 ES5 的主要区别: 变量声明方式: ES6 引入

    2024年02月02日
    浏览(42)
  • es5的实例__proto__(原型链) prototype(原型对象) {constructor:构造函数}

    现在看这张图开始变得云里雾里,所以简单回顾一下 prototype 的基本内容,能够基本读懂这张图的脉络。 先介绍一个基本概念: 在上面的例子中, Person 叫做构造函数(函数被进行构造调用,为下文方便,称之为 构造函数 ) Person.prototype 叫做 Person 的 原型对象 person1 又称之

    2024年02月10日
    浏览(33)
  • 构造函数及es6类写单例模式

            前言,什么叫做单例模式?简单点说, 单例模式就是只能创建一个由构造函数及类的实体,多次调用得到的都是第一次new出来的对象 。用处有,例如在需要全局管理的资源、频繁访问的配置信息、日志记录器、 数据库连接池 等情况下都可以使用单例模式来优化资

    2024年04月23日
    浏览(30)
  • 构造函数与class实现类的区别

    首先聊聊ES6 class定义的类和用构造函数new出来的类的一些不同之处 class声明提升 class声明内部会启用严格模式 class的所有方法都是不可枚举的 class的所有方法都没有原型对象prototype class定义的类不能被当做函数调用

    2024年01月18日
    浏览(39)
  • JavaScript版本ES5/ES6及后续版本

    Brendan Eich在短短10天内创建了JavaScript的第一个版本。它被称为摩卡,但已经具备了现代JavaScript的许多基本特性! 为了吸引Java开发人员,Mocha先是更改为LiveScript,然后又更改为JavaScript然而,JavaScript与Java几乎没有任何关系; 微软推出了IE,从网景复制JavaScript,并称之为JScript; 由

    2024年02月13日
    浏览(46)
  • 【ES5和ES6】数组遍历的各种方法集合

    特点: 没有返回值,只是针对每个元素调用func 三个参数:item, index, arr ;当前项,当前项的索引,被遍历的数组 for 循环可以在循环体中终止或跳过该循环,forEach不可以 特点:返回新的arr, 每个元素为调用函数返回的结果 参数: function:必选,数组中每个元素都会执行的函

    2024年02月12日
    浏览(33)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包