在javascript中,当你将一个对象分配给另一个对象时,实际上你创建了一个引用或别名,两个名字指向同一个东西。至少在这种情况下就是这样:
var obja = { val : 0 };
var objb = obja;
objb.val =20;
obja //Object {val: 20}
然而,在原型继承中,(对象赋值)是我们应该创建继承的方式之一。取自面向对象的Javascript(Stoyan Stefanov):
function Shape(){}
// augment prototype
Shape.prototype.name = 'shape';
Shape.prototype.toString = function() {return this.name;};
function TwoDShape(){}
// take care of inheritance
TwoDShape.prototype = Shape.prototype;
TwoDShape.prototype.constructor = TwoDShape;
// augment prototype
TwoDShape.prototype.name = '2D shape';
function Triangle(side, height) {
this.side = side;
this.height = height;
}
// take care of inheritance
Triangle.prototype = TwoDShape.prototype;
Triangle.prototype.constructor = Triangle;
Triangle.prototype.name = 'Triangle';
问题是 - 为什么这些作业按照他们的方式工作?如果我看一下之前的obja和objb作业,我希望如此:
TwoDShape.prototype = Shape.prototype;
会导致TwoDShape和Shape具有相同的原型(两者都引用相同的东西)。然后当TwoDShape开始向他的原型添加属性时,我希望它们被添加到Shape中,而这显然不会发生。