在此JavaScript代码中,当new child
的实例化导致其构造函数执行时,create方法似乎不会创建父对象。孩子似乎没有继承父母的成员函数m
。
function parent() {
parent.prototype.a =2;
parent.prototype.m = function() {
return this.a++;
}
}
function child() {
child.prototype = Object.create(parent.prototype);
child.prototype.constructor = parent;
parent.call(this);
}
var c = new child();
alert(child.prototype.m()); // 2
alert(child.prototype.m()); // 3
alert(c.m()); // FAILS!!!
答案 0 :(得分:3)
你的原型方法和继承应该在你的函数之外定义......
Action<Person> resetName = (Person p) =>
{
p.Name = null;
output.AppendFormat("NAAM PERSOON NA = " + p.Name);
};
resetName(per);
答案 1 :(得分:2)
以下基本上是您运行new child
时发生的事情:
var obj = Object.create(child.prototype);
child.call(obj);
return obj;
内联构造函数如下所示:
var obj = Object.create(child.prototype);
// inline
child.prototype = Object.create(parent.prototype);
child.prototype.constructor = parent;
parent.prototype.a =2;
parent.prototype.m = function() {
return this.a++;
}
// end inline
return obj;
您是否注意到构造函数中的任何内容都不会以任何方式修改obj
?在修改child.prototype
和parent.prototype
时,这对obj
没有任何影响,因为创建了一个child.prototype = Object.create(parent.prototype)
的新对象,其中obj
继承自旧的 child.protoype
对象。
以下是您正在做的事情的简化示例:
var proto = {};
var obj = Object.create(proto);
proto = {};
proto.m = function() {};
应该很清楚,分配到proto.m
对obj
没有影响,因为我们事先已经分配了一个新对象o proto
。
在Stack Overflow上有很多关于OOP的问题,你可以轻松搜索它们。我还建议您阅读MDN article about OOP in JS和Benefits of using `Object.create` for inheritance
答案 2 :(得分:1)
您似乎误解了如何在JavaScript中设置自定义对象。通常你会把你的方法添加到构造函数之外的原型中,在里面执行它会在每次调用构造函数时重置属性。
dput(dat)
在这种情况下,它失败了,因为你为孩子创建了新的原型。
function parent() {
}
parent.prototype.a = 2;
parent.prototype.m = function() {
return this.a++;
}
function child() {
parent.call(this);
}
child.prototype = Object.create(parent.prototype);
child.prototype.constructor = parent;
var c = new child();
alert(child.prototype.m()); // 2
alert(child.prototype.m()); // 3
alert(c.m()); // 4
在父构造函数中设置Object.create(parent.prototype);
方法之前。