【发布时间】:2014-11-25 08:53:53
【问题描述】:
我编写了以下 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”和“undefined RIP”。这是因为 this 参数在 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;
})();
这将按预期工作。 这种编译代码的特定方式有什么优势? typescript 是否决定留下那段不直观的代码?
【问题讨论】:
-
这取决于你,函数的调用者。
-
放弃原型机制会使代码更加不直观。
-
你为什么不试试
run(person.die.bind(person))?您如何期望 TypeScript 知道当您键入run(person.die)时,它应该被编译为run(person.die.bind(die))而不是run(person.die)?记住,explicit is always better than implicit。 -
@Bergi 您可以完全放弃面向对象并选择纯函数式代码。
-
您还可以修复
run函数以接受上下文参数:function run(delegate, context){ delegate.call(context); },然后是run(person.die, person);
标签: javascript typescript