为什么原型继承比闭包高效且消耗更少的内存?

why prototype inheritance is efficient and consume less memory than closure?

我在网上搜索过,但无法理解这个问题的答案。很多人对同一个问题有不同的答案。我有点困惑。

为什么比闭包更喜欢原型继承,为什么它比闭包消耗更少的内存?

我在下面写了两个例子,所以你对我的问题有基本的了解。

var foo = function () {
    this.bar = function () {
        // do something
    };
};

另一个是:

var foo = function () { };
foo.prototype.bar = function () {
    // do something
};

具有关联函数和闭包的对象在某些方面是同构的。 Structure and Interpretation of Computer Programs,CS经典教材,用闭包实现了面向对象的编程设计(用的是Scheme,但是概念差不多)

然而,在 JavaScript 中,对象内置于语言中,并且实现起来非常高效。原型是自动管理的——您可以通过链接原型来实现子类,JavaScript 引擎会自动搜索原型链以找到合适的方法。仅使用闭包很难做到这一点,因为很难正确设置所有变量范围。使用原型时,特殊的 this 对象包含原始对象,这使您可以获取其所有属性。

具有原型的对象也更加灵活,因为您可以将整个原型分配给新对象的原型。如果您随后修改原型,它会影响引用它的所有其他对象。

使用原型方法的优点是速度快,内存使用率低。

缺点是无法在 public 方法之间共享私有变量和函数,因为无法创建通用闭包。