需要了解JavaScript的寄生继承。

3

需要了解什么是寄生式继承。

我参考了这个链接:JavaScript中的寄生式继承

我需要理解这个例子的作用:

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

function Rectangle(width, height) {
   var rect;
   P = function() {};
   P.prototype = Shape;
   rect = new P();
   rect.width = width;
   rect.height = height;
   return rect;
}

第二个例子可以正常工作,但我需要知道“寄生继承是在什么情况下出现的?

var Person = function(name, age) 
{
  this.name = name;
  this.age = age;
};

var Employee = function(name, age, group) 
{
  var e = new Person(name, age);
  e.group = group;
  return e;
};

var testname= new Employee('ABC', 30, 'Developer');

谢谢。

但是链接使用了这个例子,我无法理解其逻辑。 - Siddharth_Vyas
尝试在某个地方执行它。 - thefourtheye
@thefourtheye:更新了我的问题,第二个例子可以正常工作,但需要理解寄生继承的作用。 - Siddharth_Vyas
在第一个例子中,P = function() {}; 需要加上 var - 否则会变成全局变量。 - kapa
Shape.prototype.toString 不起作用,因为 prototype 属性只有函数,而在你的示例中定义 Shape 的是一个使用字面对象语法定义的对象。 - Łukasz Szewczak
请参考http://www.crockford.com/javascript/inheritance.html。 - Tobiasz
2个回答

5

第一个例子:

它不会起作用,因为所有的对象字面量 ({..})都继承自 Object.prototype。因此,它们将没有 prototype 属性(只有函数对象才有 prototype 属性)。所以,Shape.prototype 将是 undefined,而你正在尝试在 undefined 上创建 toString 属性,这是不可能的。这就是为什么它失败的原因。

第二个例子:

这遵循了寄生继承的思想。子构造函数首先使用父类构造函数构造一个对象。然后它增加了一些东西以满足自己的需求,并返回类型为 Parent 的定制对象。由于该对象是父类的类型,因此它仍然可以访问父类的原型对象中的函数和数据。

引用自寄生 wikipedia 页面

物种之间的关系,其中一个物种(寄生虫)从另一个物种(宿主)中获益。

在这里,子类是寄生虫,它利用父类构造函数(宿主)。

注意: 子构造函数中的返回语句非常重要。它必须返回新构建的对象。否则,默认情况下会返回一个子类型的新构造对象。


4
JavaScript使用原型模型进行继承。这意味着您可以通过复制现有对象并仅添加属性来创建新对象;一个对象的原型只是另一个对象。
在大多数面向对象语言(如C++,Java等)中,存在严格的类和实例系统;如果您想要一个与Foo相似但具有Hat属性的Bar,则必须定义一个继承自Foo的类Bar(或包含Foo实例),然后实例化该类以创建一个新的BarObject。相比之下,在JavaScript中,您只有实例,并且要创建新类型,您只需向现有对象添加内容。
在您的示例中,Employee构造函数返回一个已修改以添加group属性的Person对象,而不是返回新的Employee对象。它通过寄生继承从Person继承,但是被扩展了这个新属性。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接