Class 方法 - 何时使用哪一种?
Class methods - which one to use and when?
似乎有两种不同的方法可以在 class 中定义方法。
class Foo {
handleClick = e => {
// handle click
}
// and
handleHover(e) {
// handle hover
}
}
我的问题是这两者有什么区别?
转译后,它们给出截然不同的结果:
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
var Foo = function () {
function Foo() {
_classCallCheck(this, Foo);
this.handleClick = function (e) {}
// handle click
// and
;
}
_createClass(Foo, [{
key: "handleHover",
value: function handleHover(e) {
// handle hover
}
}]);
return Foo;
}();
但我似乎看不出有什么区别。这是一个有约束力的问题吗?
谢谢!
class Foo {
handleClick = e => {
// handle click
}
}
不是 ES6。 It's a proposal for a future version of ES.
与您的示例等效的 ES5 代码是
class Foo {
constructor() {
this.handleClick = e => {
// handle click
}
}
// and
handleHover(e) {
// handle hover
}
}
与您的示例等效的 ES6 代码是
function Foo() {
this.handleClick = function(e) {
// handle click
}.bind(this);
}
Foo.prototype.handleHover = function(e) {
// handle hover
}
所以基本上 handleClick
是自动绑定到实例的,这对事件处理程序很有用,但它是以为每个实例创建一个新函数为代价的。
有关详细信息,请参阅
- Use of 'prototype' vs. 'this' in JavaScript?
- How to access the correct `this` context inside a callback?
似乎有两种不同的方法可以在 class 中定义方法。
class Foo {
handleClick = e => {
// handle click
}
// and
handleHover(e) {
// handle hover
}
}
我的问题是这两者有什么区别?
转译后,它们给出截然不同的结果:
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
var Foo = function () {
function Foo() {
_classCallCheck(this, Foo);
this.handleClick = function (e) {}
// handle click
// and
;
}
_createClass(Foo, [{
key: "handleHover",
value: function handleHover(e) {
// handle hover
}
}]);
return Foo;
}();
但我似乎看不出有什么区别。这是一个有约束力的问题吗?
谢谢!
class Foo {
handleClick = e => {
// handle click
}
}
不是 ES6。 It's a proposal for a future version of ES.
与您的示例等效的 ES5 代码是
class Foo {
constructor() {
this.handleClick = e => {
// handle click
}
}
// and
handleHover(e) {
// handle hover
}
}
与您的示例等效的 ES6 代码是
function Foo() {
this.handleClick = function(e) {
// handle click
}.bind(this);
}
Foo.prototype.handleHover = function(e) {
// handle hover
}
所以基本上 handleClick
是自动绑定到实例的,这对事件处理程序很有用,但它是以为每个实例创建一个新函数为代价的。
有关详细信息,请参阅
- Use of 'prototype' vs. 'this' in JavaScript?
- How to access the correct `this` context inside a callback?