需要了解Javascript寄生继承

时间:2014-04-23 08:48:10

标签: javascript inheritance

需要了解Parasitic Inheritance实际上做了什么。

我提到了这个链接:Parasitic Inheritance in 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');

感谢。

2 个答案:

答案 0 :(得分:4)

Javascript使用Prototype模型进行继承。这意味着您可以通过复制现有对象并只添加属性来创建新对象;一个对象的原型只是另一个对象。

在大多数OO语言中,如C ++,Java等,都有严格的类和实例系统;如果你想要一个像Foo但具有Hat属性的Bar,你必须定义一个继承自Foo(或包含Foo实例)的类Bar,然后实例化该类以创建一个新的BarObject。相比之下,在Javascript中,您拥有的只是实例,而要创建新类型,您只需将内容添加到现有类型中。

在您的示例中,Employee构造函数返回一个Person对象,该对象已经过修改以添加group属性,而不是返回一个新的Employee对象。它寄生于Person,但是已经扩展了这个新属性。

答案 1 :(得分:4)

第一个例子:

它不起作用,因为所有对象文字({..})都继承自Object.prototype。因此,它们不会具有prototype属性(只有Function对象具有prototype属性)。因此,Shape.prototype将为undefined,您尝试在toString上创建undefined属性,这是不可能的。这就是它失败的原因。

第二个例子:

这遵循寄生遗传的想法。子构造函数首先使用Parent的构造函数构造一个对象。然后它根据需要增加它并返回Parent类型的自定义对象。由于对象属于父类型,因此它仍然可以访问父对象中的函数和数据。

引自Parasitism wikipedia page

  物种之间的关系,其中一种物种,寄生虫,以牺牲另一物种为代价而受益。

这里,孩子是寄生虫,它使用父母构造函数(宿主)。

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