JavaScript 中,class 能够创建一个类,function 也能创建一个类,两者创建的类有什么区别?

class Person {
    name = 'Jack';
    sayHello() {
        console.log('hello');
    }
}

function People() {
    this.name = 'Jack';
    function sayHello() {
        console.log(this.name);
    }
}

image.png
两种方式都能创建一个类,两者创建的类有什么区别?

阅读 5k
4 个回答

其实差别还是有的,毕竟 class 是个新东西。但仅就功能而言, 社区既然已经用了这么久的ES5,屏蔽那些差异还是绰绰有余的,并且现在为了兼容老旧的浏览器,使用 ES6(+) 写的代码通常会打包成 ES5 ,所有 class 都会用 function 实现,所以前面的大佬们才会认为没有差别。
我所知道的差异:

  1. class 声明的类不是函数,只能通过 new 关键字实例化,不能直接调用, 而函数始终是函数,只在使用 new 关键字实例化的时候才是类的构造函数,既然是函数就可以调用,不过,函数里有 this 关键字的话可能会报错;
  2. class 对于属性和方法有权限控制,而 function 区分访问权限需要一些技巧,而许多开发者不会这些技巧或者懒得写,这就使得写出来的类需要按照一些约定俗成的规矩来使用,比如不要在实例上访问以 _ 开头的属性和方法。

仔细想想,这第二点是不是属于差异待议,因为这属于语法差异,和类本身关系不大。

当然,建议还是使用 class,比如下面的示例,其实功能差不多(个人水平只能屏蔽部分差异,所以只能算差不多):

// ES6(+)
class P1{
    constructor(){
        this.init();
    }
    
    init(){
        console.log('实例已经初始化');
        return this;
    }
    
    static getMeaning(){
        return '一切社会关系的总和';
    }
}

// ES4 ES5
var P2 = (function(f){
    var p = f.prototype;
    
    // 实例化对象可访问
    p.init = function init(){
        console.log('实例已经初始化');
        return this;
    };
    
    // 实例化对象不可直接访问
    f.getMeaning = function getMeaning(){
        return '一切社会关系的总和';
    };
    
    return f;
})(function P2(){
    // 模拟直接调用的情形,当然,调用栈与 class 报错的不一样
    if(!this || (this === window || global || globalThis)){
        throw "Uncaught TypeError: Class constructor P2 cannot be invoked without 'new'"
    }
    this.init(){};
});

很明显,class 写的代码要简洁得多。

没什么区别吧,class是ES6的语法糖,和function创建的类并无不同。

以前js没有class 又想用class
就委屈的用function来达到class的效果
后面js新规范添加了class

所以我理解就是 func A就是构造了一个函数 表达一个类 也相当于 class中的 constructor
而class语法糖 给你拓展 extends super 等各种糖供你使用 其实使用角度上没有什么区分
毕竟编译完成以后都是 func

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题