Javascript 将对象作为函数参数传递
我有Javascript 将对象作为函数参数传递,javascript,typescript,Javascript,Typescript,我有类A和类B通过构造函数传递的一些字段,扩展了类A,任务是为类A创建迭代器,使我有可能将其传递给超级方法(使用扩展运算符或任何其他方式)。 Object.entries()对我没有帮助。我怎么做? 我认为这段代码是不言自明的 class A { constructor(public a: string) { } } class B extends A { constructor(public b: string, a: A) { super(...Obje
类A
和类B
通过构造函数传递的一些字段,扩展了类A
,任务是为类A
创建迭代器
,使我有可能将其传递给超级
方法(使用扩展运算符或任何其他方式)。
Object.entries()
对我没有帮助。我怎么做?
我认为这段代码是不言自明的
class A {
constructor(public a: string) { }
}
class B extends A {
constructor(public b: string, a: A) {
super(...Object.entries(a));
}
}
/** can be new B('b', new A('a'));
* But not the new B('b', 'a') actually
*/
const b = new B('b', { a: 'a' });
console.log(b); // expect to get {b: 'b', a: 'a'}
// actually get {b: 'b', a: ['a', 'a']}
给你两个答案:
- 回答你的问题,然后
- 提出不同的方法
回答你的问题
我认为你做不到你所描述的。尽管您可以使用Symbol.iterator
函数返回您创建的数组的迭代器,其顺序与的构造函数的参数列表相同:
class A {
constructor(public a: string) {
}
[Symbol.iterator]() {
return [this.a][Symbol.iterator]();
}
}
…问题是super
调用无法编译,TypeScript抱怨:
super(...a); // Expected 1 arguments, but got 0 or more.
当然,除了通过以下方式禁用该错误之外,我没有看到解决方法:
…这似乎不是个好主意。(在操场上。)
提出不同的方法
即使您可以这样做,我也不推荐这样做,因为它是脆弱的:如果您更改A
的构造函数中参数的顺序,您需要更改迭代器以匹配。保持它们的同步将是维护的一个陷阱
相反,我希望构造函数能够接受A
的实例并复制其所有属性:
class A {
public a: string = "";
constructor(a: string);
constructor(obj: A);
constructor(x: string|A) {
if (x instanceof A) {
Object.assign(this, x);
} else {
this.a = x;
}
}
}
super
调用将是:
super(a);
Object.entries
返回数组列表,该列表肯定与a
的字符串类型不匹配。不确定您在这里到底期望什么…?@deceze我想找到像参数列表一样传递对象的方法。我知道Object.entries()
不起作用,所以我询问了任何可能的解决方案您的意思是B应该接受A类对象作为第二个参数而不是其他任何参数吗?或者澄清你的观点question@PranoySarkar是,并返回BI类的扩展实例。BI认为您误解了扩展。您不应该通过传递A
的实例来扩展它。A
的扩展实例就是B
的实例。还要注意的是,A
的实例没有成员(正如您当前拥有的那样),那么您希望从Object.entries
中得到什么呢{a:'a'}
不是a
的实例,也不是a
的构造函数定义a
属性。。。
super(a);