关于继承不工作的JavaScript新手问题

时间:2015-02-02 07:04:09

标签: javascript

我的样本很简单。我有一个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”,它应该在那里找到它。但似乎它没有这样做。

有人可以告诉我,我做错了吗?

1 个答案:

答案 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
   } 
});