在尝试增强Angular的ComponetFixture时,我注意到由于此类没有复制构造函数,因此无法完成此操作。 (或者我错了?)
我们假设我们有一个班级:
class A
{
constructor(public pub, private priv) { }
}
我想基于A类创建类BetterA,所以:
class BetterA extends A
{
constructor(a: A)
{
// super(a); <----- this can not be done, so maybe...
// super(a.pub, a.priv) // ...this could be better option, but...
}
myFunction(a: string) { return a; }
}
...第二个参数是PRIVATE。我无法访问它; /
在这种情况下我该怎么办?
我知道其中一个解决方案是使用这样的原型:
A.prototype['myFunction'] = function(a: string) { return a; } // this must be done with function keyword, it's not working with ()=>{} !!! /there are problem with this pointer/
但是我必须写一些奇怪的东西:
console.log( classAobject['myFunction']("abc") );
而不是
console.log( classAobject.myFunction("abc") );
或
我可以通过构图来完成:
class B
{
public a: A; // or constructor(public a: A)
myFunction(a) { return a; }
}
但似乎并不太优雅。
有没有更好的解决方案?
编辑#1
我刚刚发现了这种语法:
Class.prototype.NewFunction = function() { this.x.y.z = 123 }
有效,但会产生编译错误,代码有效,但我们得到:
'属'TextOf'在类'Class'上不存在
当你尝试这样称呼它时:
objectOfClass.NewFunction()
使得:
'属'NewFunction'在类'Class'上不存在
BUT
只有在我们使用功能关键字时才能使用它。当我们使用lambda表达式时,某些函数会出现同样奇怪的不可见问题。
答案 0 :(得分:0)
我认为构图是走到这里的方式。请记住,您正在构建一个类,而不是一个需要new运算符才能实例化对象的方法。这可能就是你要找的东西
class A{
tPub;
constructor(public pub, private priv) {
this.tPub=pub
}
}
class B extends A{
constructor(pub){
super(pub)
}
myFunc(){} //equiv to B.prototype.myFunc
}
export const myClass=new B();
//another file
import {myClass} from './file'
let m=myClass.myFunc();
不幸的是,通过将priv设置为private,它将完全按照它所告知的内容并使其成为私有对象。你也可以不用构造函数,这取决于你想对你的班级做什么。