没有复制构造函数的扩展类(带私有参数)

时间:2017-02-06 21:34:35

标签: angularjs typescript

在尝试增强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表达式时,某些函数会出现同样奇怪的不可见问题。

1 个答案:

答案 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,它将完全按照它所告知的内容并使其成为私有对象。你也可以不用构造函数,这取决于你想对你的班级做什么。