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)
哪个会按预期工作.这种特定方式编译代码的优点是什么?打字稿是否决定留下那条不直观的代码?
当您想要捕获它时,您应该使用箭头函数语法。我认为在委托创建而不是类创建时使用它会更好。
唯一需要的改变是:
run(()=>person.die());
Run Code Online (Sandbox Code Playgroud)
这允许您为任何函数捕获它,而不管它是如何定义的。
您需要稍微更改代码的结构以使其使用_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.
| 归档时间: |
|
| 查看次数: |
716 次 |
| 最近记录: |