Javascript 从子对象调用父构造函数和原型

Javascript 从子对象调用父构造函数和原型,javascript,Javascript,我试图理解JavaScript中调用构造函数和原型方法的方法 以下是我的尝试: function A() { this.getId = function() { console.log('A constructor - getId'); } } A.prototype.getId = function() { console.log('A prototype - getId'); } function B() { A.call(this);

我试图理解JavaScript中调用构造函数和原型方法的方法

以下是我的尝试:

function A() {
    this.getId = function() {
        console.log('A constructor - getId');
    }
}
A.prototype.getId = function() {
    console.log('A prototype - getId');
}
function B() {
    A.call(this);
    this.getId = function() {
        console.log('B constructor - getId');
    }
}
B.prototype = Object.create(A.prototype);
B.prototype.constructor = B;

B.prototype.getId = function() {
    console.log('B prototype - getId');
}
var p = new A();
var q = new B();

p.getId()
//A constructor - getId 

q.getId()
//B constructor - getId

p.constructor.prototype.getId()
//A prototype - getId 

q.constructor.prototype.getId()
//B prototype - getId  
最后两种方法是调用原型方法的正确方法吗


如何从子对象q调用父构造函数和原型方法

那么,我怎样才能得到它呢

来自q对象的“B原型-getId”

因为q是B的一个实例。B构造函数直接在实例上分配一个getId方法,所以这就是您得到的方法。如果您希望在B.prototype上找到一个,那么您需要删除(或不分配)实例上的一个:

// delete getId on instance
delete q.getId; 

// Now get inherited getId
q.getId()  // B prototype - getId
请注意,delete操作符只对自己的属性起作用,它不会删除
[[Prototype]]
链上的属性

最后两种方法是否正确

  • 使用p调用parents原型方法parents构造函数方法使用
  • q

  • “正确”是因为它们可以工作,尽管我不会设计成这样。

    注意你的Ps和Qs,你正在不断地重新定义这些方法。@dandavis当然,我在这里使用它是为了简单。一般来说,你不应该把目标定得太高或太低,原型的美妙之处在于你可以假装一切都是自己的属性/方法。你不需要在两者之间建立一个链接来实现可重用性,事实上,一个链接会使它变得模糊不清。你可以在任何地方说B.prototype.getId.call(A),反之亦然。@Yogesh:你明白为什么q.constructor.prototype.getId()显示了//A constructor-getId吗?在试图理解这里发生了什么之前,你应该先这样做。这将避免很多问题和混乱。如何从子对象q调用父构造函数和原型方法?