JavaScript原型继承显示父对象名称

时间:2015-09-22 18:00:30

标签: javascript prototype prototypal-inheritance

我一直在阅读有关JavaScript原型继承和原型属性的内容,我开始尝试更好地理解这些概念。但我需要帮助理解为什么我的例子没有像我想象的那样工作。

在下面的示例中,我正在尝试创建一个层次结构,在创建对象时,它会告诉您父对象的名称。但是,我的日志总是返回“对象”。

一篇文章解释说原型链是有效的,如果在对象上找不到属性,则检查父对象的原型,并且它一直向上,直到'对象',如果没有找到则返回undefined。

这是一个小提琴:http://jsfiddle.net/hqozqd0m/

Object.prototype.cname = 'object';

function plant() {
    function parentname() { return this.cname; }
    return {
        parentname:parentname
    }
}
plant.prototype.cname = 'plant';

function tomato() { 
    function parentname() { return this.cname; }
    return {
        parentname:parentname
    }
}
tomato.prototype = new plant(); // <-- settings it to plant as parent

var p = new plant();
var t = new tomato();

console.log(p.parentname()); //object
console.log(t.parentname()); //object

更新的代码 - 相同的结果

Object.prototype.cname = 'object';

function plant() {
    this.sayparentname = function() { console.log(cname); };
}
plant.prototype.cname = 'plant';

function tomato() { 
    this.sayparentname = function() { console.log(cname); };
}
tomato.prototype = new plant();

var p = new plant();
var t = new tomato();

p.sayparentname();
t.sayparentname();

1 个答案:

答案 0 :(得分:2)

通常,构造函数会修改new创建的对象,使用this.foo = bar等语句,而不返回任何内容。然后new表达式的结果就是对象。

但是,如果函数返回一个对象,该对象将替换new创建的对象;因此,当您使用new plant()时,您只需返回一个普通的Object实例。

要修复代码,您只需要这样做:

function Plant() {
    function parentName() { return this.cname; }

    this.parentName = parentName;
}