使用ES6的原型继承

时间:2017-08-23 21:39:53

标签: javascript inheritance ecmascript-6

我们如何在ES6中使用class关键字来动态添加方法,就像我们在ES5中一样?

https://jsfiddle.net/user1212/7c57eou3/

val result = dataFrame
  .groupBy("key")
  .agg(
    collect_list($"itemList").as("A"),                          // all items
    collect_list(when($"click".isNotNull, $"itemList")).as("B") // subset of A
  )
  // create sparse item vector from all list of items A
  .withColumn("vectorA", aggToSparseUdf($"A"))                  
  // create sparse item vector from all list of items B (subset of A)
  .withColumn("vectorB", aggToSparseUdf($"B"))      
  // calculate ratio vector B / A
  .withColumn("ratio", divideVectors($"vectorB", $"vectorA"))

val keys: Seq[String] = result.head.getAs[Seq[String]]("key")
val values: Seq[SparseVector] = result.head.getAs[Seq[SparseVector]]("ratio")

如何在定义类后添加新方法?

2 个答案:

答案 0 :(得分:2)

您不使用class关键字添加更多方法。就像在ES5中一样,您只需将它们分配给原型对象:

class Person { … }
…
Object.assign(Person.prototype, { // Object.assign provides a neater syntax
    logName() {                   // but really is the same as Person.prototype.logName = …
        console.log(this.name);
    },
    alertName() {
        alert(this.name);
    }
});

答案 1 :(得分:0)

其他人已回答您的具体问题,您可以使用prototype

但提醒一下,如果你要修改class的原型来添加方法,也许你想使用extends语法并创建一个"子类",所以你总是使用相同的类逻辑而不触及原型。

对于大多数来自其他语言的程序员来说很难理解prototype-style classes,所以如果你只能使用ES6 典型的课程风格,我会说去吧。像这样:

class Hello {
  constructor(name) {
    this.name = name;
  }

  hello() {
    return 'Hello ' + this.name + '!';
  }

  static sayHelloAll() {
    return 'Hello everyone!';
  }
}

class HelloWorld extends Hello {
  constructor() {
    super('World');
  }

  echo() {
    alert(super.hello());
  }
}

var hw = new HelloWorld();
hw.echo();

alert(Hello.sayHelloAll());

taken from here