在定义es6类后,我可以添加一个方法吗?

时间:2018-01-25 02:10:28

标签: class methods ecmascript-6 super

方法

method() {}

功能

function func() {}

以上只是详细说明方法与功能的区别。

class Student {
  constructor(name, age) {
    this.name = name;
    this.age = age;  
  }
  method1(){}
}

在上面的类中,写完定义之后。 我想在类中添加一个方法2,类似于method1的方式。 我可以添加像soo

这样的函数
Student.prototype.func = function(){...}

但我无法在同一个类上添加方法。在内部函数中,我将无法使用super,因为它只在方法中可用。

  1. 有没有办法在定义类后添加方法?
  2. 这样我就可以在里面使用超级。

2 个答案:

答案 0 :(得分:1)

您的片段向原型添加新属性只是稍后添加功能的方法。在这种情况下的一个主要区别是,像这样的简单赋值将默认情况下将属性创建为可枚举,而类语法将创建为不可枚举。你可以用

Object.defineProperty(Student.prototype, "func", {
  configurable: true,
  writable: true,
  value: function() {

  },
});

至少解决这个问题。

不幸的是,正如您所见,之后向原型中添加内容不允许使用super.foo。没有办法支持这一点,因为super的行为特别基于方法语法method(){}的词法嵌套在类语法中。稍后以编程方式添加的方法将无法知道哪个原型是" super"之一。

答案 1 :(得分:1)

正如已经解释的那样,您只能在常规super()定义中使用class。但是,在我们使用ES6之前,我们手动调用了父方法实现。可以使用父母的原型来完成:

class Person {
    talk() {
       // some implementation here
    }
}

class Student extends Person {
  constructor(name, age) {
    this.name = name;
    this.age = age;  
  }
}

Student.prototype.talk = function(data) {
   // now call base method manually
   Person.prototype.talk.call(this, data);
   // then do our extra work
   log(data);
}

当然,通常你可以在class声明中声明所有方法,所以这通常不是你通常需要做的事情。