m0m*_*eni 7 javascript inheritance ecmascript-6 babeljs
将以下代码发布到Babel REPL中
class Test {
}
class Test2 extends Test {
}
Run Code Online (Sandbox Code Playgroud)
你得到这个inherits功能
function _inherits(subClass, superClass) {
if (typeof superClass !== "function" && superClass !== null) {
throw new TypeError("Super expression must either be null or a function, not " + typeof superClass);
}
subClass.prototype = Object.create(superClass && superClass.prototype, {
constructor: {
value: subClass,
enumerable: false,
writable: true,
configurable: true
}
});
if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass;
}
Run Code Online (Sandbox Code Playgroud)
它看起来没什么问题,直到我意识到这是做既Object.create对原型和一个setPrototypeOf电话.我不熟悉setPrototypeOf所以我去了MDN,它说:
如果您关心性能,则应避免设置对象的[[Prototype]].相反,使用Object.create()创建具有所需[[Prototype]]的新对象.
这对我来说很困惑,因为他们同时使用两者.为什么会这样?
应该换行
if (superClass && !superClass.prototype)
Run Code Online (Sandbox Code Playgroud)
当原型未设置时,它仍然有一个__proto__?
在setPrototypeOf不设置[[原型]的subClass从原来的价值Function.prototype来superClass,让它继承它的静态属性.
Object.create这里不能使用(就像它.prototype对象一样),因为它不允许创建函数.显然,类的构造函数必须是一个函数; 并且唯一的方法是使用标准表达式/声明创建函数,然后更改其原型.