我有一节课,让我们说A
。我需要声明一个原型属性,可以按如下方式访问:
var idKey = A.prototype.attributeId;
我可以使用以下代码执行此操作:
class A {
constructor() {
A.prototype.attributeId = "InternalId";
}
}
有更好的方法吗?
答案 0 :(得分:9)
这不太理想,但它符合您的需求。
class A {
attributeId:string;
}
A.prototype.attributeId = "InternalId";
这会将es5编译为:
var A = (function () {
function A() {
}
return A;
})();
A.prototype.attributeId = "InternalId";
答案 1 :(得分:6)
这是另一种方法,使用装饰器:
function setProto(value: any) {
return((target: any, key: string) => {
target[key] = value;
});
}
class A {
@setProto("InternalId")
attributeId:string;
}
它被编译为一些粘合代码(仅定义一次)和:
var A = (function () {
function A() {
}
__decorate([
setProto("InternalId")
], A.prototype, "attributeId");
return A;
})();
答案 2 :(得分:0)
这是一个使用类装饰器和泛型的方法,以确保您不会分配给类中不存在的属性:
const mixin = <B>(behaviour: B) => <M extends B, TFunction extends Function>(Class: TFunction & {new(...args: Array<any>): M}) => {
Reflect.ownKeys(behaviour).forEach(key => {
if(key !== 'constructor') {
if(Class.prototype.hasOwnProperty(key))
console.warn(`Warning: mixin property overrides ${Class.name}.${key}`);
Object.defineProperty(Class.prototype, key, Object.getOwnPropertyDescriptor(behaviour, key))
}
});
return Class;
};
@mixin({
bar: 'baz'
})
class Foo {
bar: string;
}
const foo = new Foo;
console.log(Foo.prototype.bar, foo.bar, foo.hasOwnProperty('bar'));
// prints baz baz false
继承工作正常,只修改子类原型:
@mixin({
zip: 7,
bar: 'zaz'
})
class Zoo extends Foo {
zip: number;
}
const zoo = new Zoo;
console.log(zoo.zip, zoo.bar, foo.bar);
// prints 7 zaz baz
答案 3 :(得分:-2)
是的,如果您要定位ECMAScript5或更高版本,那么您可以在类上使用以下属性语法
class A {
private internalId: number = 1;
get attributeId() {
return this.internalId;
}
set attributeId(newVal) {
this.internalId = newVal;
}
}