js类和构造函数的4点差异

本文探讨了JavaScript中的变量提升问题,指出函数表达式在使用前会被提升,但类却没有这种现象,存在暂时性死区。同时,文章对比了构造函数与类在new操作上的差异,构造函数可直接调用,而类必须使用new。此外,类默认采用严格模式,不支持arguments.callee。最后,文章指出了类的原型上的方法无法通过for...in遍历,而构造函数可以通过原型链访问到。
摘要由CSDN通过智能技术生成

一,变量提升问题

  console.log(Man);
    function Man(name, age) {
      this.name = name
      this.age = age
    }

是可以打印的

但是用类的方法,就有暂时性死区了

console.log(Man);
    class Man {
      constructor(name, age) {
        this.name = name
        this.age = age
      }
    }

二,new的问题

如果是类的方法,那只能用new,没有new的话报错

console.log(Man());

 

 而构造函数可以,因为它本来就是一个函数,返回值为undefined,想要返回值,就得手动加上

 

 function Man(name, age) {
      this.name = name
      this.age = age
      return '我是没有new也行的返回值'
    }

 

 console.log(Man('小白', 19));

三, class采用的是严格模式

arguments.callee指向当前arguments指向的函数

function Man(name, age) {
      this.name = name
      this.age = age
      console.log(arguments.callee);
      return '我是没有new也行的返回值'
    }

打印出

ƒ Man(name, age) {
      this.name = name
      this.age = age
      console.log(arguments.callee);
      return '我是没有new也行的返回值'
    }

但是在class中

 class Man {
      constructor(name, age) {
        this.name = name
        this.age = age
        console.log(arguments.callee);
      }
    }

就会报错

 



四,class原型上的对象不能遍历

先看一下构造函数方式

function Man(name, age) {
      this.name = name
      this.age = age
      console.log(arguments.callee);
      return '我是没有new也行的返回值'
    }
    // Man.prototype.say = function () {
    //   console.log(`你好${this.name}`);
    // }
    Man.prototype = {
      hit() {
        console.log('打你一下哦');
      }
    }

然后遍历的时候

let p1 = new Man('小白', 18)
    for (let key in p1) {
      console.log(key);
    }

 可以把原型上的hit打印出来

但是用class的方式

class Man {
      constructor(name, age) {
        this.name = name
        this.age = age
      }
      play() {//这是原型上的方法
        console.log('我爱运动');
      }
    }

只能打印name和age,不能打印出play

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值