1

jsFiddle 演示

我有从 Shape 继承的 F。

F.prototype = Shape.prototype;

F 创建名为 test 的新方法。

F.prototype.test = function(){return 'test';};

我知道,如果我编写F.prototype = Shape.prototype;了我在 F 中创建的所有方法,那么从 Shape 继承的其他类将可以使用这些方法。

我做错了什么?

为什么我在执行代码时会出错alert(B.test());

function Shape(){}
Shape.prototype.name = 'shape';
Shape.prototype.toString = function() {return this.name;};

var F = function(){};
F.prototype = Shape.prototype;
F.prototype.test = function(){return 'test';};


function Triangle(side, height) {
this.side = side;
this.height = height;
}

Triangle.prototype = new F();
Triangle.prototype.constructor = Triangle;
Triangle.prototype.name = 'Triangle';

var my = new Triangle(5, 10);
alert(my.toString());

var Second_class = function(){};
Second_class.prototype = Shape.prototype;
B.prototype = new Second_class();
alert(B.test());

在这个例子中,当F继承自jsFiddleShapeTriangle创建自F jsFiddle 演示 woek 好

4

1 回答 1

2

我有从 Shape 继承的 F。

F.prototype = Shape.prototype;

严格来说,你不是。您正在覆盖函数的prototype属性。F要构建真正的继承链,您需要使用

F.prototype = Object.create(Shape.prototype);

因此 Shape 的属性在 F 实例上仍然可用,但反之则不行(因为两个原型都是同一个对象)。所以回答你的第一个问题:是的,你做到了。

另请参阅为什么我不使用 Child.prototype = Parent.Prototype 而不是 Child.prototype = new Parent(); 用于 Javascript 继承?

为什么当我执行代码时 alert(B.test()); 它不工作?

这很容易解释。B(您忘记在示例中声明,但假设它是一个函数)是一个 Function 对象。您没有为其分配任何属性。您所做的是设置它的原型属性(使用new关键字也正确设置原型链,但不小心创建了一个实例 -Object.create是首选)。所以现在,任何实例B将从该原型对象继承:

var b = new B();
b.test();
于 2012-09-19T18:39:58.127 回答