2017-08-03 106 views
1

/A.js具有以下代码;ES6中的属性继承JS类

class A { 
    constructor(token) { 
     this.token = token; 
    } 
    lok() { 
     return 'hello'; 
    } 
} 
module.exports = A 

/dir1/dir2/B.js具有以下代码;

let A = require(__dirname + '/../../A.js') 
class B extends A { 
    constructor(token) { 
     super(token) 
    } 
    tok() { 
     return this.token; 
    } 
} 
module.exports = B 

问题是,我该如何从类A继承令牌属性,

let init = new A('123') 
init.tok() //will return token 

而是我的问题是,我该如何继承一个基类(A)在构造函数中声明的属性,所以我可以在一个子类(B)中使用它们。

+1

除非我错过了一些东西 - 你没有在任何地方使用'B'类? – Tom

+1

当然,你打算显示'新B('123')'而不是'新A('123')'? – mscdex

+0

@mscdex B本身没有标记,它从A继承了标记,所以我认为A必须使用标记进行初始化? –

回答

2

执行let init = new A('123')时,您正在创建A类的实例。这意味着init只具有A类的属性和方法,值得注意的是,意味着init没有在B上声明的tok方法。

如果您执行let init = new B('123'),则将创建B类的实例,该实例还继承A类的属性。

在构造函数Bsuper(token)意味着A调用构造函数与参数token,所以你设置this.token = token。然后,你可以把你的B -instance init并在其上成功调用tok

let init = new B('123') 
init.tok() // '123' 

你也仍然可以调用lok这个init,因为任何B实例继承从A

init.lok() // 'hello' 
+0

谢谢你的解释! –

2

你问题更多的是因为A类型的任何对象不是都有tok()方法,因为这只是在B类。虽然A确实具有token属性,但它不具有使用该方法检索它的能力。例如,你可以这样做:

let init = new A('123') 
// init.tok() // this will never work as the method only exists on `B` objects 
console.log(.init.token); // this will work fine because you add the property in the constructor 
+0

短而甜,很好的解释!感谢您的时间! –

+0

当然,但@罗宾詹姆斯的答案有一点肉。 :)很高兴你选择了那一个。 – jakerella