2 回答
TA贡献2051条经验 获得超10个赞
ES6类是我们今天使用的原型类系统的语法糖。它们使您的代码更简洁,自我记录,这是使用它们的理由(在我看来)。
使用Babel来转换这个ES6类:
class Foo {
constructor(bar) {
this._bar = bar;
}
getBar() {
return this._bar;
}
}
会给你这样的东西:
var Foo = (function () {
function Foo(bar) {
this._bar = bar;
}
Foo.prototype.getBar = function () {
return this._bar;
}
return Foo;
})();
第二个版本并不复杂,维护的代码更多。当涉及到继承时,这些模式变得更加复杂。
因为这些类编译成我们一直使用的相同原型模式,所以你可以对它们进行相同的原型操作。这包括在运行时添加方法等,访问方法Foo.prototype.getBar等。
今天ES6中有一些基本的隐私支持,虽然它基于不导出您不想访问的对象。例如,您可以:
const BAR_NAME = 'bar';
export default class Foo {
static get name() {
return BAR_NAME;
}
}
并且BAR_NAME不可用于其他模块直接引用。
许多库已经尝试支持或解决这个问题,比如Backbone和他们的extends帮助器,它们采用类似方法的函数和属性的未经验证的散列,但是没有用于暴露原型继承的编组系统,不涉及原型。
随着JS代码变得越来越复杂并且代码库越来越大,我们开始发展很多模式来处理继承和模块之类的事情。IIFE用于创建模块的私有范围有很多括号和parens; 缺少其中一个可能导致一个完全不同的有效脚本(在模块可以将下一个模块作为参数传递给它之后跳过分号,这很少有用)。
tl; dr:它是我们已经做过的糖,并且在代码中明确了你的意图。
添加回答
举报