You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ES6类语法的方法定义简写是否仅创建单个共享函数对象?

ES6类的方法简写:是共享函数还是每次实例化新建?

好问题!咱们直接给结论:ES6类里这种简写定义的方法,和你第二种传统写法(挂载在prototype上)的行为完全一致——只会创建一个共享的函数对象,所有实例都会复用它,绝对不会像第一种传统写法那样每次实例化都生成新函数。

为什么会这样?

ES6的class语法本质上只是ES5原型继承的语法糖,它并没有改变JavaScript基于原型的核心继承机制。当你用class里的方法简写(比如name() { ... })定义方法时,这个方法会被自动挂载到类的prototype属性上,和你手动写Car.prototype.name = function() { ... }的效果一模一样。

所有通过new Car()创建的实例,访问instance.name时,都是从原型链上找到这个共享的函数,不会为每个实例单独创建新的函数副本。

三种写法的底层逻辑对比

咱们再把三种写法的差异理清楚:

  1. 不推荐的传统写法(构造函数内定义方法)

    function Car() {
      this.make = "Renault";
      this.model = "Twingo";
      this.name = function () { return this.make + this.model; };
    }
    

    每次调用new Car()时,构造函数里的this.name = function()都会执行一次,导致每个实例都拥有自己独立的name函数,既浪费内存,也完全没必要。

  2. 推荐的传统写法(挂载到prototype)

    function Car() {
      this.make = "Renault";
      this.model = "Twingo";
    }
    Car.prototype.name = function() { return this.make + this.model; }
    

    name函数只在Car.prototype上存在一份,所有实例共享这同一个函数,内存占用更优,这也是原型继承的最佳实践之一。

  3. ES6 class写法

    class Car {
      constructor(make, model) {
        this.make = make;
        this.model = model;
      }
      name () {
        return this.make + this.model;
      }
    }
    

    经过JavaScript引擎编译后,这段代码的行为和第二种传统写法几乎完全一致——name方法被放到了Car.prototype上,所有实例共享同一个函数对象。

直观验证

你可以用一段简单的代码验证这个结论:

const car1 = new Car('Renault', 'Twingo');
const car2 = new Car('Toyota', 'Corolla');
console.log(car1.name === car2.name); // 输出 true

这个true就说明两个实例的name方法指向的是同一个函数对象,完全是共享的。

内容的提问来源于stack exchange,提问作者memememe

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 08:09:57