ES6方法定义速记是否仅创建一个功能对象?

时间:2019-06-08 20:35:06

标签: javascript oop object

使用在JavaScript中创建类的“旧方法”,您通常会避免这样做:

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

因为它将在类的每个实例创建一个新的函数对象,所以您宁愿这样做:

function Car {
    this.make = "Renault";
    this.model = "Twingo";
}

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

在ES6中,使用更新的class语法,我们可以执行以下操作:

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

这仅创建一个共享功能对象吗?还是在每个new调用中都像第一个一样实例一个新的?

1 个答案:

答案 0 :(得分:2)

将为每个实例创建在构造函数中定义为属性的函数。您在外部构造函数中定义的函数将在该原型上可用。因此,名称functon将仅创建一次。

说这是你的课程

class Test {
  constructor(prop1, prop2) {
    this.prop1 = prop1;
    this.prop2 = prop2;
    this.func1 = function() {};
  }
  func2() {}
}

const test = new Test('one','two');

如果签入devtools,则可以看到func1可用于每个实例,而func2可用于原型。

Test {prop1: "one", prop2: "two", func1: ƒ}
  func1: ƒ ()
  prop1: "one"
  prop2: "two"
  __proto__:
    constructor: class Test
    func2: ƒ func2()