我想知道是否有可能以某种方式将javascript箭头函数“绑定”到它所作用域的原型实例。
基本上,我想使用箭头函数从原型中获取实例变量。我知道这不能仅通过箭头函数来完成,但我很好奇是否可以在分配之前将此箭头函数绑定到实例范围。以下的想法:
String.prototype.myFunction = (() => {
console.log(this.toString());
}).naiveBindNotionICantDescribe(String.prototype);
这相当于:
String.prototype.myFunction = function() {
console.log(this.toString());
};
我很好奇,因为我试图看看javascript箭头函数是否可以完全取代javascript函数,如果你理解它们并且对它们很聪明,或者如果有没有关键字“函数”完全无法完成的事情,即使是聪明的方式。
这是我的意思的一个例子:
/* anonymous self-contained demo scope. */
{
/**
* example #1: using function to reach into instance variable via prototype
* anonymous scope.
*/
{
String.prototype.get1 = function() {
return this.toString();
};
console.log('hello'.get1());
}
/**
* example 2: what I want to do but can't express in a way that works.
* This does not work.
* anonymous scope.
*/
{
String.prototype.get2 = () => {
return this.toString();
};
console.log('hello'.get2());
}
}
这是可能做的,还是到达实例变量绝对必要的函数,没有办法绕过这个?
明显的解决方案:
代码:
var magicBind = (callback) => function() {
return callback(this);
};
String.prototype.get = magicBind((self) => {
return self.toString();
});
console.log('hello'.get());
代码:
Function.prototype.magicBind2 = function() {
var self = this;
return function() {
return self(this);
}
};
String.prototype.get2 = ((self) => {
return self.toString();
}).magicBind2();
console.log('hello'.get2());
代码:
var regex = /\{([.|\s|\S]+)\}/m;
String.prototype.get = (() => {}).constructor(
(() => {
return this;
}).toString().match(regex)[0]
);
console.log('hello, world'.get());
到目前为止,这两个解决方案都允许埋葬“function”关键字,同时允许访问本地范围。
答案 0 :(得分:3)
没有。对this
值进行词汇绑定是箭头函数的 point 。
它们不是函数声明和函数表达式的一般替代。
答案 1 :(得分:0)
我知道单靠箭头功能无法做到这一点,但我很好奇 如果可以将此箭头函数绑定到实例 分配前的范围。
确切地说,它可以单独完成,但您可以将>>> (action(j) for j in items if j > 2)
Number is 6
设置为所需的值...将其包装在正常函数中:
this
但此时箭头功能变得多余了。
答案 2 :(得分:0)
我希望做一些魔法,包括将实例作为参数传递给箭头函数,并使用此实例“self”代替“this”。有一些类似于hastebin.com/baxadaxoli.coffee但没有“功能”的东西。例如,在赋值期间传递“self”而不通过某个magicBind操作创建函数。
var magicBind = (callback) => function (...args) {
'use strict';
return callback(this, args);
}
var log = (self, args) => {
console.log('this: %o args: %o', self, args);
};
String.prototype.log = magicBind( log );
'hello'.log();
足够的魔法? ;)
编辑但是,为什么你坚持使用胖箭。即使你必须通过循环来实现你想要的。只是为了从你.min.js文件中删除几个字符
/ *
log
比get
更合适,
并且console.log()没有返回值的函数的结果是没有意义的;如果该函数的唯一目的是调用console.log()本身,那就更少了 * /