JS原型链

时间:2015-10-18 10:28:09

标签: javascript inheritance

解决

在最底层分配原型是覆盖我以前的声明。感谢Guffa快速回答。

我一直在浏览并找到一个好的答案,mods,如果这是一个很好的抱歉,我很抱歉。

代码.. 我有三个功能,分别是一个,两个和三个。 我希望三个人从两个继承,两个从一个继承。三个原型应该一直回到一个原点。 我可以在三个实例中调用一个方法。但是我无法从两个方法中调用方法。

以下是一个例子。

function one () {
  this.version = 1;
};

one.prototype.one = function () {
  return 'I live on the one class';
};

function two () { // extends one
  this.version = 2;
};

two.prototype.two = function () {
  return 'I live on the two class';
};

function three () { // extends two
  this.version = 3;
};

three.prototype.three = function () {
  return 'I live on the three class';
};

two.prototype = Object.create(one.prototype);
three.prototype = Object.create(two.prototype);

var x = new three();

x.one // -> 'I live on the one class!'
x.two // -> undefined
x.three // -> undefined

当我打电话给x.one时,我得到了预期的输出,我住在一个班级'。 但是x.two是未定义的。 当我查看原型链时,根本没有任何方法/属性在两个链上。只有一个原型可以访问。

我的大脑在哭。

修改 我还没有尝试过x.three,但它也未定义。也许我继承的方式是覆盖原型而不是共享? 虽然如果这是问题,我觉得我可以访问两个而不是一个。我不确定为什么我可以访问根类,但两者之间没有,甚至在被调用的实例上都没有。它好像三只是对一个的引用。

1 个答案:

答案 0 :(得分:2)

在为方法添加方法后,您正在替换twothree的原型。原型链工作正常,但更换原型后,twothree方法不在原型中。

在向其添加方法之前替换原型:



function one () {
  this.version = 1;
};

one.prototype.one = function () {
  return 'I live on the one class';
};

function two () { // extends one
  this.version = 2;
};

two.prototype = Object.create(one.prototype);

two.prototype.two = function () {
  return 'I live on the two class';
};

function three () { // extends two
  this.version = 3;
};

three.prototype = Object.create(two.prototype);

three.prototype.three = function () {
  return 'I live on the three class';
};

var x = new three();

// Show values in snippet
document.write(x.one() + '<br>'); // -> 'I live on the one class'
document.write(x.two() + '<br>'); // -> 'I live on the two class'
&#13;
&#13;
&#13;