使用箭头功能模拟javascript函数

时间:2016-08-06 22:02:43

标签: javascript functional-programming

我想知道是否有可能以某种方式将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());  
    }  
}

这是可能做的,还是到达实例变量绝对必要的函数,没有办法绕过这个?

明显的解决方案

  1. 包装魔术棒(感谢托马斯)
  2. 代码:

    var magicBind = (callback) => function() { 
        return callback(this);
    };
    String.prototype.get = magicBind((self) => {
        return self.toString();
    });
    console.log('hello'.get());
    
    1. 功能转换器从“胖箭”到“功能”,(受托马斯回答的启发)
    2. 代码:

      Function.prototype.magicBind2 = function() {
          var self = this;
      
          return function() {
              return self(this);
          }
      };
      
      String.prototype.get2 = ((self) => {
          return self.toString();
      }).magicBind2();
      
      console.log('hello'.get2());
      
      1. 第一个解决方案没有明确使用'function',它将“Function”构造函数称为(()=> {})。构造函数以避免使用“function”或“Function”这个词。
      2. 代码:

        var regex = /\{([.|\s|\S]+)\}/m;
        
        String.prototype.get = (() => {}).constructor(
            (() => {
                return this;
            }).toString().match(regex)[0]
        );
        
        console.log('hello, world'.get());
        

        到目前为止,这两个解决方案都允许埋葬“function”关键字,同时允许访问本地范围。

3 个答案:

答案 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文件中删除几个字符

/ * logget更合适,

并且console.log()没有返回值的函数的结果是没有意义的;如果该函数的唯一目的是调用console.log()本身,那就更少了 * /