原型链始终打印父方法

时间:2015-05-24 23:14:11

标签: javascript inheritance

function A(name, gender) {
    this.name = name;
    this.gender = gender;
}

A.prototype.speak = function() {
    alert('Calling from A ' + this.name);
};

function B(name, gender){
    this.name = name;
    this.gender = gender;
}

B.prototype.speak = function() {
    alert('Calling from B ' + this.name);
};

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

var b = new B('shane', 'M');
console.log(b);
b.speak();
  1. 为什么prototype chain查看父原型方法而不是查看Child原型方法?
  2. 我的instance b仅包含instance propetiesmethods而不是prototype methods吗?
  3. 上面的代码打印"Calling from A Shane";

2 个答案:

答案 0 :(得分:2)

原型链以期望它工作的方式工作,但是当您使用Object.create分配时,您将使用A的原型覆盖B的原型。

关于原型继承(令人困惑,是的,神奇的,没有)没有什么神奇之处,它只是遍历原型链,直到找到匹配的方法。通过覆盖B&B的原型,您已从链中移除了B&#39}的speak版本。

为了让事情按照你想要的方式运作(例如让B继承自A,但拥有它自己的speak方法),你需要从B <覆盖方法em>在之后你已经分配了原型:

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

B.prototype.speak = function() {
    alert('Calling from B ' + this.name);
};

<强> jsbin

B的实例将在其原型上具有所有方法,但如果需要,您还可以添加仅实例方法。

答案 1 :(得分:1)

  1. 因为您先设置B.prototype.speak,然后通过将原型设置为A.prototype
  2. 来覆盖它
  3. 它也将有原型方法