【发布时间】:2017-05-04 08:59:16
【问题描述】:
我正在尝试在类实例中添加一些属性(例如插件系统)。 为此,我按照example 使用类装饰器来做到这一点:
function testDecorator(target:any) {
// save a reference to the original constructor
var original = target;
// the new constructor behaviour
var f : any = function (...args: any[]) {
console.log("New: " + original.name);
return original.apply(this, args)
}
// copy prototype so intanceof operator still works
f.prototype = original.prototype;
// return new constructor (will override original)
return f;
}
class AbstractClass {
constructor() {
console.log('Init AbstractClass');
}
}
@testDecorator
class AClass extends AbstractClass {
constructor() {
super();
console.log('Init AClass');
}
foo() {
console.log('Launch foo');
}
}
class BClass extends AClass {
constructor() {
super();
console.log('Init BClass');
}
bar() {
console.log('Launch bar');
}
}
var bInstance = new BClass();
bInstance.foo();
bInstance.bar();
但它不起作用:因为目标是一个类,我得到这个错误:
return original.apply(this, args);
^
TypeError: Class constructor AClass cannot be invoked without 'new'
我知道我不能这样做,因为类构造函数(不是原型函数“构造函数”)。
所以我尝试将这段代码修改为:
function testDecorator(target:any) {
// save a reference to the original constructor
var original = target;
// the new constructor behaviour
var f : any = function (...args: any[]) {
console.log("New: " + original.name);
return new original(...args)
}
// copy prototype so instanceof operator still works
f.prototype = original.prototype;
// return new constructor (will override original)
return f;
}
class AbstractClass {
constructor() {
console.log('Init AbstractClass');
}
}
@testDecorator
class AClass extends AbstractClass {
constructor() {
super();
console.log('Init AClass');
}
foo() {
console.log('Launch foo');
}
}
class BClass extends AClass {
constructor() {
super();
console.log('Init BClass');
}
bar() {
console.log('Launch bar');
}
}
var bInstance = new BClass();
bInstance.foo();
console.log(bInstance instanceof AClass);// true
console.log(bInstance instanceof BClass);// false
bInstance.bar();
这样,bInstance 就不再是 BClass 的实例了。所以它也不起作用。所以我得到这个错误:
bInstance.bar();
^
TypeError: bInstance.bar is not a function
有什么建议吗?
谢谢。
【问题讨论】:
标签: javascript class typescript decorator ecmascript-next