打字稿为什么不使用"自我"技巧?

Gil*_*ans 3 javascript typescript

我写了以下TypeScript代码:

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

public die(){
    this.lastname += " RIP";
}
Run Code Online (Sandbox Code Playgroud)

这编译为:

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

    Person.prototype.die = function () {
        this.lastname += " RIP";
    };
    return Person;
})();
Run Code Online (Sandbox Code Playgroud)

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

function run(delegate){
    delegate();
}

var person = new Person("guy", "dude");
run(person.die);
alert(person.lastname);
alert(lastname);
Run Code Online (Sandbox Code Playgroud)

这里预期的警报将是"dude RIP",然后是"undefined".但是,实际结果将是"dude"和"undefined 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;
})();
Run Code Online (Sandbox Code Playgroud)

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

Tit*_*mir 8

当您想要捕获它时,您应该使用箭头函数语法。我认为在委托创建而不是类创建时使用它会更好。

唯一需要的改变是:

run(()=>person.die());
Run Code Online (Sandbox Code Playgroud)

这允许您为任何函数捕获它,而不管它是如何定义的。

  • 这比接受的答案要好得多,后者更像是一个黑客。 (2认同)

Ros*_*ott 7

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

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

    die = () => {
        this.lastName += "dead"
    }
}
Run Code Online (Sandbox Code Playgroud)

变为:

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

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

  • 这样我可以决定何时使用此模式,何时不使用.谢谢!我还发现为什么使用原型比使用这种方法更可取.通过这种方式,每个对象都具有该函数的副本,从而导致更大的内存占用.使用原型,每个对象都更加纤薄.谢谢! (5认同)