Javascript 动态继承类型脚本
JavaScript允许动态继承。我想知道TypeScript是否考虑到了这一点。下面的代码可能会说明这个问题Javascript 动态继承类型脚本,javascript,typescript,inheritance,Javascript,Typescript,Inheritance,JavaScript允许动态继承。我想知道TypeScript是否考虑到了这一点。下面的代码可能会说明这个问题 // inheritance.js function fn1() { this.a = "fn1"; } function fn2() { // ... } let f1 = new fn1(); // "instance" of fn1 let f2 = new fn2(); // "instance" of fn2 // inheritance f2.__proto_
// inheritance.js
function fn1() {
this.a = "fn1";
}
function fn2() {
// ...
}
let f1 = new fn1(); // "instance" of fn1
let f2 = new fn2(); // "instance" of fn2
// inheritance
f2.__proto__ = f1;
// f2.a inherits from f1
console.log(f2.a); // output: "fn1"
如您所见,我们在f2的原型链中添加了一个对象f1,它是fn1的一个实例。
因此,我的问题是:我们可以通过使用类在TypeScript中重现这种行为吗?
如何更改以下代码以获得预期的输出
// inheritance.ts
class class1 {
public a: string = "class1";
}
class class2 extends class1 {
// ...
}
let c1 = new class1();
let c2 = new class2();
console.log(c1.a); // output: "class1"
// this line would not work
c2.__proto__ = c1;
// change value c1.a
c1.a = "dynamical inheritance test";
console.log(c2.a); // should print value of c1.a (i.e "dynamical inheritance test")
我想你要找的是一个十字路口。这里有一个简单的例子。要做您想做的事情,您,您基本上可以将混合的结果类分配给To继承类,然后复制要作为结果扩展的类的所有属性:
function extendDynamic<T, U>(first: T, second: U): T & U {
let result = <T & U>{};
(<any>result) = (<any>first);
for (let it in second) {
if (second.hasOwnProperty(it)) {
(<any>result)[it] = (<any>second[it]);
}
}
return result;
}
class Class1 {
public a: string;
constructor(n: string) {
this.a = n;
}
}
class Class2 {
b: string = 'bbb';
}
const a = new Class1("bar");
const b = extendDynamic(a, new Class2());
a.a = 'foo';
console.log(b.a, b.b); // foo, bbb
函数扩展动态(第一个:T,第二个:U):T&U{
让结果={};
(结果)=(第一);
为了(让它在第二){
if(第二个hasOwnProperty(it)){
(结果)[it]=(第二个[it]);
}
}
返回结果;
}
一班{
公共a:字符串;
构造函数(n:string){
这个,a=n;
}
}
二级{
b:string='bbb';
}
常数a=新类别1(“bar”);
常数b=extendDynamic(a,新的Class2());
a、 a=‘foo’;
console.log(b.a,b.b);//富,bbb
这不是继承,这是暴力。非常感谢蒂姆对你的建设性和洞察力的评论,你很好!该评论实际上非常有用,请围绕主题看。好的,你是对的,谢谢你提供的有关使用的警告性建议。我在这里使用了。uuu proto_uuuu来说明我的问题。请注意,通过传输baao给出的解决方案而获得的.js文件不包含任何内容。uuuu proto_uu谢谢baao,这正是我要找的:)