需要了解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');
感谢。
答案 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类型的自定义对象。由于对象属于父类型,因此它仍然可以访问父对象中的函数和数据。
物种之间的关系,其中一种物种,寄生虫,以牺牲另一物种为代价而受益。
这里,孩子是寄生虫,它使用父母构造函数(宿主)。
注意:子构造函数中的return语句非常重要。它必须返回新构造的对象。否则,默认情况下将返回一个新构造的子类型对象。