向es6子类添加方法

时间:2017-09-07 15:22:18

标签: javascript typescript ecmascript-6 prototypal-inheritance

我想创建一个派生自Array的新类,除了常规数组方法之外,它还有自己的方法。

export class ObjectCollection<T extends Iidentifier> extends Array<T> {

  constructor(collection: T[] = []) {
    super(...collection);
  }

  // used for getting instance from a collection of objects
  public getInstance(id: Id) {
    return this.find(item => item.Id.toString() === id.toString()) || new 
    Array<T>();
  }

}

我还有从该类继承的子类。

export class TargetCategories extends ObjectCollection<TargetCategory> {

  constructor(categories: TargetCategory[] = []) {
    super(categories);
  }

  public getCategoryType(id: Iidentifier): string {
    return this[id].Category.length < 2 ? "dummy" : "saved";
  }

}

当我实例化TargetCategories对象时,我只能使用数组中的方法。我无法调用getCategoryType和getInstance之类的东西。

2 个答案:

答案 0 :(得分:-1)

我把它们放在一起,修复了一些小错误,看起来没问题。

type Id = number;
interface Iidentifier {
    Id: number;
}

class ObjectCollection<T extends Iidentifier> extends Array<T> {

  constructor(collection: T[] = []) {
    super(...collection);
  }

  // used for getting instance from a collection of objects
  public getInstance(id: Id) {
    return this.find(item => item.Id.toString() === id.toString()) || new 
    Array<T>();
  }

}

interface TargetCategory extends Iidentifier {
    Category: number[];
}

class TargetCategories extends ObjectCollection<TargetCategory> {

  constructor(categories: TargetCategory[] = []) {
    super(categories);
  }

  public getCategoryType(id: Iidentifier): string {
    return this[id.Id].Category.length < 2 ? "dummy" : "saved";
  }
}

let tc = new TargetCategories();
tc.getInstance(1);
tc.getCategoryType({ Id: 2 });

答案 1 :(得分:-1)

我找到了一种工作方式,但我怀疑这是唯一的方式,还是最干净的方式。

interface IDifferentArray {
    id: string | number;
}

export class DifferentArray<T extends IDifferentArray> extends Array<T> {

    public lengthMessage: () => void;
    public otherMethod: () => number;

    constructor(items: Array<T> = []) {
        super(...items);

        this.lengthMessage = function() {
            return `My length is ${this.length}`;
        }

        this.otherMethod = function() {
            return 12;
        }
    }
}

您可以访问本机数组方法,属性并添加自己的实例方法。如果将它放在构造函数之外,它将是一个类方法。

这就是它在普通javascript中的工作方式。我认为es6 /打字稿会模仿真实的OOP,但不要猜测。