我一直在阅读有关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();
答案 0 :(得分:2)
通常,构造函数会修改new
创建的对象,使用this.foo = bar
等语句,而不返回任何内容。然后new
表达式的结果就是对象。
但是,如果函数返回一个对象,该对象将替换new
创建的对象;因此,当您使用new plant()
时,您只需返回一个普通的Object实例。
要修复代码,您只需要这样做:
function Plant() {
function parentName() { return this.cname; }
this.parentName = parentName;
}