从超级继承属性

时间:2018-10-02 17:21:32

标签: javascript

我是JS的新手-像许多JS初学者一样,我对财产继承感到有些困惑。 据我了解,构造函数拥有一个称为原型的属性。此属性指向原型对象。 因此,当我定义两个构造函数时:

function Super(){
this.x = 1 }

function Sub(){
this.y = 2 }

它们都将指向原型对象。

使用下面的代码行,Sub将继承Super的属性:

Sub.prototype = new Super();

现在的问题是:这里到底发生了什么? Sub.prototype指向的“旧”原型对象是否会被用新Super()创建的新对象替换?

亲切的问候 亨宁

1 个答案:

答案 0 :(得分:2)

是的,以某种方式

function Super(){
  this.x = Math.random()
}

function Sub(){
  this.y = 2 //this will be keeped
}
Sub.prototype.myMethod = function(){} //this will be lost

Sub.prototype = new Super();

但是通过这种方式,您依靠单例

console.log(new Sub().x === new Sub().x) //true

如果您想完成覆盖原型,可以这样做

Sub.prototype = Super.prototype

如果您想扩展覆盖原型,可以这样做

Object.assign(Sub.prototype, Super.prototype)

如果您想扩展原型,可以这样做

Object.assign(Sub.prototype, {...Super.prototype, ...Sub.prototype})

或现代ES6

class Sub extends Super{
  constructor(){
    super()
    //...
  }
}