Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/476.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 从超级用户继承属性_Javascript - Fatal编程技术网

Javascript 从超级用户继承属性

Javascript 从超级用户继承属性,javascript,Javascript,我是JS新手——和许多JS初学者一样,我对财产继承有些困惑。 据我所知,构造函数拥有一个名为prototype的属性。此属性指向原型对象。 所以当我定义两个构造函数时,比如: function Super(){ this.x = 1 } 及 它们都指向一个原型对象 使用以下代码行,Sub将继承Super的属性: Sub.prototype = new Super(); 现在的问题是:这里到底发生了什么?Sub.prototype指向的“旧”原型对象是否会被用new Super()创建的新对象

我是JS新手——和许多JS初学者一样,我对财产继承有些困惑。 据我所知,构造函数拥有一个名为prototype的属性。此属性指向原型对象。 所以当我定义两个构造函数时,比如:

function Super(){
this.x = 1 }

它们都指向一个原型对象

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

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

问候 亨宁是的,在某种程度上

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})
如果您想扩展覆盖原型,可以这样做

Sub.prototype = Super.prototype
Object.assign(Sub.prototype, Super.prototype)
Object.assign(Sub.prototype, {...Super.prototype, ...Sub.prototype})
如果您想扩展原型,可以这样做

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()
    //...
  }
}

“用下面的代码”-你从哪里得到的。“旧的”
Sub.prototype
对象是否会被新对象替换”-是。虽然这并没有真正实现什么。直到你开始实例化
new Sub
对象,
Sub.prototype
才有了新的值。try Object.create()@Bergi:谢谢你的链接。实际上,我首先偶然发现了“sub.prototype=Object.create(Super.prototype)”-方法。因为我不明白这一点,所以我从过时的方法开始。您了解
Object.create
(单独创建,而不是在本场景中创建)实现的功能吗?您知道
新的
操作符做什么,以及它与构造函数的
.prototype
属性有什么关系吗?