为什么没有打字稿使用' self'特技?

时间:2014-11-25 08:53:53

标签: javascript typescript

我编写了以下TypeScript代码:

class Person {
    constructor(public firstname: string, public lastname:string){
}

public die(){
    this.lastname += " RIP";
}

这编译为:

var Person = (function() {
    function Person(firstname, lastname) {
        this.firstname = firstname;
        this.lastname = lastname;
    }

    Person.prototype.die = function () {
        this.lastname += " RIP";
    };
    return Person;
})();

当然这是一种有效的方法,但在以下情况下它不会按预期工作:

function run(delegate){
    delegate();
}

var person = new Person("guy", "dude");
run(person.die);
alert(person.lastname);
alert(lastname);

此处的预期警报将是" dude RIP",然后" undefined"。但是,实际结果将是" dude"和"未定义的RIP"。这是因为这个参数在JS中很奇怪。

一个常见的解决方案是通过闭包使用自变量,并放弃原型机制,即

var Person = (function() {
    function Person(firstname, lastname) {
        var self = this;
        self.firstname = firstname;
        self.lastname = lastname;
        self.die = function() {
            self.lastname += " RIP";
        }
    }
    return Person;
})();

哪个会按预期工作。 这种特定方式编译代码的优点是什么?打字稿是否决定留下那条不直观的代码?

2 个答案:

答案 0 :(得分:7)

您需要稍微更改代码的结构,以使其使用_this = this模式:

class Person {
    constructor(public firstName: String, public lastName: String) {
    }

    die = () => {
        this.lastName += "dead"
    }
}

变为:

var Person = (function () {
function Person(firstName, lastName) {
    var _this = this;
    this.firstName = firstName;
    this.lastName = lastName;
    this.die = function () {
        _this.lastName += "dead";
    };
}
return Person;
})();

关键部分是你需要将die函数放在对象而不是原型上,这迫使它使用_this = this

答案 1 :(得分:3)

如果要捕获它,则应使用箭头函数语法。我认为最好在委托创建而不是类创建时使用它。

唯一需要改变的是:

run(()=>person.die());

这使您可以捕获任何函数,无论它是如何定义的。