Javascript A.prototype=B.prototype和A.prototype=new B()之间有什么区别?
我正在学习JavaScript,并找到了两种分配原型的方法 第一个是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
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
A.prototype = Object.create(B.prototype);
这只是另一种技术
A.prototype = B.prototype;
通过这样做,对B
原型的任何更改也将更改A
原型,因为它们是
同一个物体,肯定会有不良的副作用
A.prototype = new B();
利用这一点,我们还可以通过原型实现继承
我们通过使a
aB
原型成为B
的一个实例,从而使aaB
示例#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