diff --git a/packages/babel-plugin-transform-es2015-classes/src/loose.js b/packages/babel-plugin-transform-es2015-classes/src/loose.js index 953a8a23228fe..a47ece74c734e 100644 --- a/packages/babel-plugin-transform-es2015-classes/src/loose.js +++ b/packages/babel-plugin-transform-es2015-classes/src/loose.js @@ -8,13 +8,32 @@ export default class LooseClassTransformer extends VanillaTransformer { this.isLoose = true; } + _insertProtoAliasOnce() { + if (!this.methodAlias) { + this.methodAlias = this.path.scope.generateUidIdentifier("proto"); + const classProto = t.memberExpression( + this.classRef, + t.identifier("prototype"), + ); + const protoDeclaration = t.variableDeclaration("var", [ + t.variableDeclarator(this.methodAlias, classProto), + ]); + + this.body.push(protoDeclaration); + this.aliasInserted = true; + return true; + } + return false; + } + _processMethod(node, scope) { if (!node.decorators) { // use assignments instead of define properties for loose classes let classRef = this.classRef; if (!node.static) { - classRef = t.memberExpression(classRef, t.identifier("prototype")); + this._insertProtoAliasOnce(); + classRef = this.methodAlias; } const methodName = t.memberExpression( classRef, diff --git a/packages/babel-plugin-transform-es2015-classes/test/fixtures/loose-classCallCheck/with-constructor/expected.js b/packages/babel-plugin-transform-es2015-classes/test/fixtures/loose-classCallCheck/with-constructor/expected.js index e0e9ee4b8572f..f10ac140ad9d1 100644 --- a/packages/babel-plugin-transform-es2015-classes/test/fixtures/loose-classCallCheck/with-constructor/expected.js +++ b/packages/babel-plugin-transform-es2015-classes/test/fixtures/loose-classCallCheck/with-constructor/expected.js @@ -5,7 +5,9 @@ let A = function A() { let B = function () { function B() {} - B.prototype.b = function b() { + var _proto = B.prototype; + + _proto.b = function b() { console.log('b'); }; diff --git a/packages/babel-plugin-transform-es2015-classes/test/fixtures/loose/constructor-order/expected.js b/packages/babel-plugin-transform-es2015-classes/test/fixtures/loose/constructor-order/expected.js index 633459e7b28fc..065b90daf3de5 100644 --- a/packages/babel-plugin-transform-es2015-classes/test/fixtures/loose/constructor-order/expected.js +++ b/packages/babel-plugin-transform-es2015-classes/test/fixtures/loose/constructor-order/expected.js @@ -1,5 +1,7 @@ var x = function () { - x.prototype.f = function f() { + var _proto = x.prototype; + + _proto.f = function f() { 1; 2; 3; diff --git a/packages/babel-plugin-transform-es2015-classes/test/fixtures/loose/literal-key/expected.js b/packages/babel-plugin-transform-es2015-classes/test/fixtures/loose/literal-key/expected.js index 126cb3ecded66..1bb06b9c2871a 100644 --- a/packages/babel-plugin-transform-es2015-classes/test/fixtures/loose/literal-key/expected.js +++ b/packages/babel-plugin-transform-es2015-classes/test/fixtures/loose/literal-key/expected.js @@ -1,7 +1,9 @@ var Foo = function () { function Foo() {} - Foo.prototype["bar"] = function bar() {}; + var _proto = Foo.prototype; + + _proto["bar"] = function bar() {}; return Foo; -}(); +}(); \ No newline at end of file diff --git a/packages/babel-plugin-transform-es2015-classes/test/fixtures/loose/method-return-type-annotation/expected.js b/packages/babel-plugin-transform-es2015-classes/test/fixtures/loose/method-return-type-annotation/expected.js index 513dccbcdf3a4..950273999984f 100644 --- a/packages/babel-plugin-transform-es2015-classes/test/fixtures/loose/method-return-type-annotation/expected.js +++ b/packages/babel-plugin-transform-es2015-classes/test/fixtures/loose/method-return-type-annotation/expected.js @@ -2,9 +2,11 @@ var C = function () { function C() {} - C.prototype.m = function m(x: number): string { + var _proto = C.prototype; + + _proto.m = function m(x: number): string { return 'a'; }; return C; -}(); +}(); \ No newline at end of file diff --git a/packages/babel-plugin-transform-es2015-classes/test/fixtures/loose/method-reuse-prototype/actual.js b/packages/babel-plugin-transform-es2015-classes/test/fixtures/loose/method-reuse-prototype/actual.js new file mode 100644 index 0000000000000..1c08a36449802 --- /dev/null +++ b/packages/babel-plugin-transform-es2015-classes/test/fixtures/loose/method-reuse-prototype/actual.js @@ -0,0 +1,5 @@ +class Test { + a() {} + static b() {} + c() {} +} diff --git a/packages/babel-plugin-transform-es2015-classes/test/fixtures/loose/method-reuse-prototype/expected.js b/packages/babel-plugin-transform-es2015-classes/test/fixtures/loose/method-reuse-prototype/expected.js new file mode 100644 index 0000000000000..859c173d159bb --- /dev/null +++ b/packages/babel-plugin-transform-es2015-classes/test/fixtures/loose/method-reuse-prototype/expected.js @@ -0,0 +1,13 @@ +var Test = function () { + function Test() {} + + var _proto = Test.prototype; + + _proto.a = function a() {}; + + Test.b = function b() {}; + + _proto.c = function c() {}; + + return Test; +}(); \ No newline at end of file diff --git a/packages/babel-plugin-transform-es2015-classes/test/fixtures/regression/T6755/expected.js b/packages/babel-plugin-transform-es2015-classes/test/fixtures/regression/T6755/expected.js index 74bafa673b0ab..0b335e4c1ae73 100644 --- a/packages/babel-plugin-transform-es2015-classes/test/fixtures/regression/T6755/expected.js +++ b/packages/babel-plugin-transform-es2015-classes/test/fixtures/regression/T6755/expected.js @@ -3,11 +3,13 @@ var Example = function () { function Example() {} - Example.prototype.test1 = async function test1() { + var _proto = Example.prototype; + + _proto.test1 = async function test1() { await Promise.resolve(2); }; - Example.prototype.test2 = regeneratorRuntime.mark(function test2() { + _proto.test2 = regeneratorRuntime.mark(function test2() { return regeneratorRuntime.wrap(function test2$(_context) { while (1) { switch (_context.prev = _context.next) { @@ -23,4 +25,4 @@ var Example = function () { }, test2, this); }); return Example; -}(); +}(); \ No newline at end of file diff --git a/packages/babel-plugin-transform-flow-comments/test/fixtures/flow-comments/transformed-class-method-loose-return-type-annotation/expected.js b/packages/babel-plugin-transform-flow-comments/test/fixtures/flow-comments/transformed-class-method-loose-return-type-annotation/expected.js index af26da01bc67c..0c3f51c0a95f1 100644 --- a/packages/babel-plugin-transform-flow-comments/test/fixtures/flow-comments/transformed-class-method-loose-return-type-annotation/expected.js +++ b/packages/babel-plugin-transform-flow-comments/test/fixtures/flow-comments/transformed-class-method-loose-return-type-annotation/expected.js @@ -4,7 +4,9 @@ var C = function () { function C() {} - C.prototype.m = function m(x + var _proto = C.prototype; + + _proto.m = function m(x /*: number*/ ) /*: string*/ @@ -13,4 +15,4 @@ var C = function () { }; return C; -}(); +}(); \ No newline at end of file diff --git a/packages/babel-plugin-transform-flow-strip-types/test/fixtures/regression/transformed-class-method-loose-return-type-annotation/expected.js b/packages/babel-plugin-transform-flow-strip-types/test/fixtures/regression/transformed-class-method-loose-return-type-annotation/expected.js index d3f42768b7218..abf414bec33d4 100644 --- a/packages/babel-plugin-transform-flow-strip-types/test/fixtures/regression/transformed-class-method-loose-return-type-annotation/expected.js +++ b/packages/babel-plugin-transform-flow-strip-types/test/fixtures/regression/transformed-class-method-loose-return-type-annotation/expected.js @@ -3,9 +3,11 @@ var C = function () { function C() {} - C.prototype.m = function m(x) { + var _proto = C.prototype; + + _proto.m = function m(x) { return 'a'; }; return C; -}(); +}(); \ No newline at end of file