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

Iar*_*hev 5 javascript prototype new-operator

我正在学习 JavaScript,发现了两种分配原型的方法。

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

例如:

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
Run Code Online (Sandbox Code Playgroud)
  1. 有什么区别以及更喜欢哪种方式?
  2. 还有其他方法来分配原型吗?

更新:

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

A.prototype = Object.create(B.prototype);
Run Code Online (Sandbox Code Playgroud)

Roy*_*mir 3

这只是另一种技术。

\n\n
A.prototype = B.prototype;\n
Run Code Online (Sandbox Code Playgroud)\n\n

通过这样做,对B原型的任何更改也会改变A原型,因为它们\xe2\x80\x99是相同的对象,并且\xe2\x80\x99必然会产生不良的副作用。

\n\n
 A.prototype = new B();\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n

我们通过将原型作为 的实例来创建Aa 。BAB

\n\n

示例#1:

\n\n
function A() {  console.log("A!")}\nfunction B() {  console.log("B!")}\nA.prototype = new B();\na = new A();    \nB.bb=function (){alert(\'\');}\nconsole.log(a.bb()) //Uncaught TypeError: Object #<B> has no method \'bb\' \n
Run Code Online (Sandbox Code Playgroud)\n\n

现在看看这个:

\n\n
function A() {  console.log("A!")}\nfunction B() {  console.log("B!")}\nA.prototype = B.prototype;\na = new A();    \nB.prototype.bb=function (){alert(\'\');}\nconsole.log(a.bb()) //does alert\n
Run Code Online (Sandbox Code Playgroud)\n