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

Javascript A.prototype=B.prototype和A.prototype=new B()之间有什么区别?,javascript,prototype,new-operator,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 ca

我正在学习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
  • 有什么区别吗?选择哪种方式
  • 是否有其他方式分配原型
  • 更新:

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

    A.prototype = Object.create(B.prototype);
    

    这只是另一种技术

    A.prototype = B.prototype;
    
    通过这样做,对
    B
    原型的任何更改也将更改
    A
    原型,因为它们是 同一个物体,肯定会有不良的副作用

     A.prototype = new B();
    
    利用这一点,我们还可以通过原型实现继承

    我们通过使
    a
    a
    B
    原型成为
    B
    的一个实例,从而使a
    a
    B

    示例#1:


    您可以尝试向B添加一些内容,您将得到不同的结果:

    function A() {
      console.log("A!")
    }
    
    function B() {
      this.text = "aaa";
    }
    
    你将有:

    // 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" }
    

    @Iaroslav Karandashev,不同之处在于,在一种情况下,您只继承功能

    A.prototype = B.prototype;
    
    在另一种情况下,您同时继承状态和功能

    A.prototype = new B();
    
    您可以稍微更改第一种情况,以获得相同的行为:

    // 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
    

    “2.是否有其他方法来分配原型?”是的:在谷歌Chrome和Firefox中,我有一个实例B//true(在第一种情况下)@yarix你是对的。绝对正确。(与
    B
    混淆)。editing@RoyiNamir,你的例子毫无意义。在第一种情况下,即使创建B类的实例,B.bb也不可用。您刚刚创建了一个B类型的静态bb函数,仅此而已。安德烈的回答更正确。区别在于,在一种情况下,您只继承方法,在第二种情况下,您同时继承状态和功能。@Alexandr您理解我的答案了吗?在第一个示例中,我试图说明,即使向B函数添加道具,它也无法识别它。与第二个示例相反,如果我设置了B.proto.bb,那么更改是visible@RoyiNamir,您的示例,据我所知,它没有显示A.prototype=new B()之间的差异;A.原型=B.原型;它更多的是关于:B.bb=function(){alert(“”);}和B.prototype.bb=function(){alert(“”);}。第一个函数无论如何都不可见,并且它与如何定义.prototype无关。第一个示例中的更改:A.prototype=new B();行到:A.prototype=B.prototype;就像第二个例子。第一个示例的控制台输出不会改变,您会得到相同的错误;在A的构造函数中,它将变得相同?我以为你希望A成为B的原型,为什么你要在A的构造函数中调用B?我发现它的工作方式就像Java中的调用
    super()
    。因此,它有助于继承超类的属性。
    A.prototype = new B();
    
    // 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