首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >A.prototype = B.prototype和A.prototype = new ()之间有什么区别?

A.prototype = B.prototype和A.prototype = new ()之间有什么区别?
EN

Stack Overflow用户
提问于 2014-02-04 07:54:58
回答 3查看 1.2K关注 0票数 5

我正在学习JavaScript,并找到了两种分配原型的方法。

第一个是A.prototype = B.prototype,第二个是A.prototype = new B()

例如:

代码语言:javascript
复制
function A() {
  console.log("A!")
}

function B() {
  console.log("B!")
}

// First case
A.prototype = B.prototype;
a = new A();  // a instanceof A,B

// Second case
A.prototype = new B();
a = new A();  // a instanceof A,B
  1. 有什么不同吗?选择哪种方式?
  2. 还有其他方法来分配原型吗?

更新:

正如Felix建议的那样,还有第三种分配原型的方法:

代码语言:javascript
复制
A.prototype = Object.create(B.prototype);
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-02-04 08:00:41

这只是另一种技术。

代码语言:javascript
复制
A.prototype = B.prototype;

通过这样做,对B原型的任何更改也会更改A原型,因为它们是同一个对象,这必然会产生不良的副作用。

代码语言:javascript
复制
 A.prototype = new B();

使用它,我们还可以通过原型来实现继承。

我们通过使A原型成为B的一个实例来使A成为一个B

例1:

代码语言:javascript
复制
function A() {  console.log("A!")}
function B() {  console.log("B!")}
A.prototype = new B();
a = new A();    
B.bb=function (){alert('');}
console.log(a.bb()) //Uncaught TypeError: Object #<B> has no method 'bb' 

现在看看这个:

代码语言:javascript
复制
function A() {  console.log("A!")}
function B() {  console.log("B!")}
A.prototype = B.prototype;
a = new A();    
B.prototype.bb=function (){alert('');}
console.log(a.bb()) //does alert
票数 3
EN

Stack Overflow用户

发布于 2014-02-04 08:01:13

您可以尝试在B中添加一些内容,这样就可以得到不同的结果:

代码语言:javascript
复制
function A() {
  console.log("A!")
}

function B() {
  this.text = "aaa";
}

你将拥有:

代码语言:javascript
复制
// First case
A.prototype = B.prototype;
a = new A();  

// a --> {}


// Second case
A.prototype = new B();
a = new A();  // a instanceof A,B

// a --> { text="aaa" }
票数 1
EN

Stack Overflow用户

发布于 2017-02-08 16:27:33

@Iaroslav Karandashev,区别是在一种情况下,您只继承功能

代码语言:javascript
复制
A.prototype = B.prototype;

在另一种情况下,您可以同时继承状态和功能。

代码语言:javascript
复制
A.prototype = new B();

您可以稍微修改第一种情况,以便具有相同的行为:

代码语言:javascript
复制
// First case
function B() {
  console.log("B!")
}
//child:
function A() {
  console.log("A!")
  //invoke parent constructor:
  B.apply(this);
}

A.prototype = B.prototype;
a = new A();  // a instanceof A,B


// Second case
function B() {
  console.log("B!")
}
//child, you do not need to invoke constructor of base class:
function A() {
  console.log("A!")
}
//base class constructor is invoked here:
A.prototype = new B();
a = new A();  // a instanceof A,B
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21546841

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档