对于JavaScript原型继承,为什么不能创建父对象并将其保存在子代的构造函数中?

时间:2015-04-26 03:10:14

标签: javascript prototype prototypal-inheritance

在此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!!!

3 个答案:

答案 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.prototypeparent.prototype时,这对obj没有任何影响,因为创建了一个child.prototype = Object.create(parent.prototype)的新对象,其中obj继承自旧的 child.protoype对象。

以下是您正在做的事情的简化示例:

var proto = {};
var obj = Object.create(proto);
proto = {};
proto.m = function() {};

应该很清楚,分配到proto.mobj没有影响,因为我们事先已经分配了一个新对象o proto

在Stack Overflow上有很多关于OOP的问题,你可以轻松搜索它们。我还建议您阅读MDN article about OOP in JSBenefits 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); 方法之前。