我是JS的新手-像许多JS初学者一样,我对财产继承感到有些困惑。 据我了解,构造函数拥有一个称为原型的属性。此属性指向原型对象。 因此,当我定义两个构造函数时:
function Super(){
this.x = 1 }
和
function Sub(){
this.y = 2 }
它们都将指向原型对象。
使用下面的代码行,Sub将继承Super的属性:
Sub.prototype = new Super();
现在的问题是:这里到底发生了什么? Sub.prototype指向的“旧”原型对象是否会被用新Super()创建的新对象替换?
亲切的问候 亨宁
答案 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()
//...
}
}