打字稿错误引用_this

时间:2015-10-18 11:37:14

标签: javascript typescript defineproperty

我尝试在 TypeScript 中为String.Prototype定义一些属性:

Object.defineProperty(String.prototype, 'test', {
    value: () => {
        console.log("this is a test over text " + this);
    }
})

javaScript 原型中,this指的是调用该方法的对象(在本例中为字符串值)。但是文件的编译输出是:

var _this = this;
Object.defineProperty(String.prototype, 'test', {
    value: function () {
        console.log("this is a test over text " + _this);
    }
});

TypeScript编译器添加变量_this并引用它。

这是一个错误还是我的实施中存在问题?

1 个答案:

答案 0 :(得分:11)

  

这是一个错误还是我的实施中存在问题?

不,它是TypeScript'} arrow functions的工作原理:在箭头函数中,this是从创建函数的上下文继承的,而不是由如何设置它被称为。 (箭头功能也在ES2015中,至少部分受到了CoffeeScript"胖箭头"功能的启发;我不知道TypeScript的历史以及它是否也是灵感的一部分对于ES2015的箭头功能,反之亦然。)

以下是上述规范链接的引用:

  

函数表达式引入了一个新的动态绑定,而箭头函数表达式保留了它的封闭上下文。

     

箭头函数表达式对于编写回调特别有用,否则通常会出现未定义或意外的回调。

     

在示例中

class Messenger {  
    message = "Hello World";  
    start() {  
        setTimeout(() => alert(this.message), 3000);  
    }  
};

var messenger = new Messenger();  
messenger.start();
     

使用箭头函数表达式会使回调与周围的' start'相同。方法

如果您希望this依赖于函数的调用方式,请不要使用箭头函数,请使用function

Object.defineProperty(String.prototype, 'test', function() {
    console.log("this is a test over text " + this);
})

另请注意as nils points out Object.defineProperty的第三个参数应该是属性描述符,而不是函数。你可能意味着:

Object.defineProperty(String.prototype, 'test', {
    value: function() {
        console.log("this is a test over text " + this);
    }
});

TypeScript转换器doesn't change that at all;致电"testing".test()输出"this is a test of text testing"



Object.defineProperty(String.prototype, 'test', {
    value: function() {
        snippet.log("this is a test over text " + this);
    }
});
"testing".test();

<!-- Script provides the `snippet` object, see http://meta.stackexchange.com/a/242144/134069 -->
<script src="//tjcrowder.github.io/simple-snippets-console/snippet.js"></script>
&#13;
&#13;
&#13;