self functions
Aside from returning this
you're suggesting an alternate syntax for arrow
functions? I don't see any value here.
More importantly, the syntax is ambiguous for unnamed functions.
// already valid syntax
var self = function self(){};
For classes, you can use decorators 1, if they eventually get in in the language (just one extra symbol):
function self (object, name, descriptor) {
var original = descriptor.value;
return {
...descriptor,
value (...args) {
original.apply(this, args);
return this;
},
};
}
class Foo {
constructor () {
this.x = 0;
}
@self
method () {
this.x++;
}
}
console.log(new Foo().method().x) // 1
for ES5 style "classes", you can just use functions (2 extra symbols):
function self (original) {
return function (...args) {
original.apply(this, args);
return this;
};
}
function Foo () {
this.x = 0;
}
Foo.prototype.method = self(function () {
this.x++;
});
console.log(new Foo().method().x) // 1
+1 for the decorator/function solution. It hardly affects performance in practice, since the resulting wrapped function is a whopping two lines by itself, and engines can optimize that very easily and efficiently. I don't think there needs to be new syntax for it.
One thing I like about JavaScript: its flexibility. I'd say that after ES7 or ES8, there won't be a ton of reason for syntactic additions.
From: Jussi Kalliokoski <jussi.kalliokoski at gmail.com>
To: Bucaran <jbucaran at me.com>
Cc: "es-discuss at mozilla.org >> es-discuss" <es-discuss at mozilla.org>
Date: Tue, 28 Jul 2015 09:43:58 +0300 Subject: Re: self functions
For classes, you can use decorators 1, if they eventually get in in the language (just one extra symbol):
function self (object, name, descriptor) {
var original = descriptor.value;
return {
...descriptor,
value (...args) {
original.apply(this, args);
return this;
},
};
}
class Foo {
constructor () {
this.x = 0;
}
@self
method () {
this.x++;
}
}
console.log(new Foo().method().x) // 1
for ES5 style "classes", you can just use functions (2 extra symbols):
function self (original) {
return function (...args) {
original.apply(this, args);
return this;
};
}
function Foo () {
this.x = 0;
}
Foo.prototype.method = self(function () {
this.x++;
});
console.log(new Foo().method().x) // 1
On Tue, Jul 28, 2015 at 5:06 AM, Bucaran <jbucaran at me.com> wrote:
Add a self
decorator to functions that makes them return this
by
default.
export function self myMethod () {
// return this by default
}
This decorator could be used to make any function bound to the current
scope this
as well so:
func(function self () { // this is bound to my dad’s scope
})
Would be roughly equivalent to:
func(() => { // this is bound to my dad’s scope })
Although I personally would favor the arrow function syntax, the self
decorator could be
used to optimize binding generators, so instead of:
func(function* () { }.bind(this))
One could write:
func(function self* () { })
Similary it could be used in promise handlers, so instead of:
new Promise(function (resolve, reject) { }.bind(this))
One could write:
new Promise(function self (resolve, reject) { })
It would be even sweeter if you didn’t need to specify the keyword function
when writing self
functions:
new Promise(self (resolve, reject) { })
Add a
self
decorator to functions that makes them returnthis
by default.This decorator could be used to make any function bound to the current scope
this
as well so:Would be roughly equivalent to:
Although I personally would favor the arrow function syntax, the
self
decorator could be used to optimize binding generators, so instead of:One could write:
Similary it could be used in promise handlers, so instead of:
One could write:
It would be even sweeter if you didn’t need to specify the keyword function when writing
self
functions: