ES6类语法的方法定义简写是否仅创建单个共享函数对象?
好问题!咱们直接给结论:ES6类里这种简写定义的方法,和你第二种传统写法(挂载在prototype上)的行为完全一致——只会创建一个共享的函数对象,所有实例都会复用它,绝对不会像第一种传统写法那样每次实例化都生成新函数。
为什么会这样?
ES6的class语法本质上只是ES5原型继承的语法糖,它并没有改变JavaScript基于原型的核心继承机制。当你用class里的方法简写(比如name() { ... })定义方法时,这个方法会被自动挂载到类的prototype属性上,和你手动写Car.prototype.name = function() { ... }的效果一模一样。
所有通过new Car()创建的实例,访问instance.name时,都是从原型链上找到这个共享的函数,不会为每个实例单独创建新的函数副本。
三种写法的底层逻辑对比
咱们再把三种写法的差异理清楚:
不推荐的传统写法(构造函数内定义方法)
function Car() { this.make = "Renault"; this.model = "Twingo"; this.name = function () { return this.make + this.model; }; }每次调用
new Car()时,构造函数里的this.name = function()都会执行一次,导致每个实例都拥有自己独立的name函数,既浪费内存,也完全没必要。推荐的传统写法(挂载到prototype)
function Car() { this.make = "Renault"; this.model = "Twingo"; } Car.prototype.name = function() { return this.make + this.model; }name函数只在Car.prototype上存在一份,所有实例共享这同一个函数,内存占用更优,这也是原型继承的最佳实践之一。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

