我的样本很简单。我有一个Person对象,它有两个属性 - 一个'name'和一个名为'sayName'的函数。我的目标是允许一个名为Woman的子类型继承它。
以下是排序代码段:
function Person(name) {
this.name = name;
this.sayName = function() {
console.log(this.name);
};
}
function Woman(name) {
this.name = name;
}
Woman.prototype = Object.create(Person.prototype, {
constructor : {
enumerable: true,
configurable: true,
writable: true,
value: Woman
}
});
var woman = new Woman("Jane");
// I'M GETTING AN ERROR ON THIS LINE, SAYING UNDEFINED FUNCTION
woman.sayName();
现在我知道另一种方法是将sayName()函数附加到原型。但根据我的阅读,JavaScript应该检查Woman对象自己的“sayName”属性(它不会找到),然后它将查看Woman对象的“sayName”原型(它将找不到)。然后它应该提升到Person对象并在其自己的属性中查找“sayName”,它应该在那里找到它。但似乎它没有这样做。
有人可以告诉我,我做错了吗?
答案 0 :(得分:4)
然后它应该升到Person对象并寻找" sayName"在它自己的属性中,它应该在那里找到它。
哪个Person
对象?您只是将Person.prototype
插入到Woman
的原型链中,但Person.prototype
也没有sayName
属性。您永远不会调用Person
,因此Person
实例不能存在。
您忘记在孩子的实例上调用父母的构造函数:
function Woman(name) {
Person.call(this, name);
}
但是,sayName
应该在Person.prototype
上真正定义。
function Person(name) {
this.name = name;
}
Person.prototype.sayName = function() {
console.log(this.name);
};
function Woman(name) {
Person.call(this, name);
}
Woman.prototype = Object.create(Person.prototype, {
constructor : {
enumerable: true,
configurable: true,
writable: true,
value: Woman
}
});