繁体   English   中英

如何从基础对象继承函数并在javascript中覆盖它

[英]How do I inherit a function from a base object and overwrite it in javascript

我正在尝试做的是让子对象为基础对象中定义的功能提供其自己的实现。 到目前为止,据我所知,原型是实现此目的的最佳方法(唯一!)。

另请注意,我目前正在使用游戏引擎: Turbulenz进行开发 ,因此,我试图尽可能地遵循/坚持自己的风格。 在引擎中,按以下方式定义和创建“类” /对象

function baseObject() { }
baseObject.prototype = 
{
    myMember1: 1,
    myMember2: 2,

    myMethod: function myMethodFn() {
        return this.myMember1 + this.myMember2;
    }
}

baseObject.Create = function baseObjectCreateFn
{
    var o = new baseObject();
    return o;
}

这将允许我执行以下操作

var anObject = baseObject.Create();
var someValue = anObject.myMethod(); // should return 3

我现在想做的是创建一个继承了baseObject所有属性的新对象,同时允许我覆盖其myMethod函数,例如减去两个成员值而不是add。

我是否必须说要创建另一个对象然后更改其原型是否正确? 最让我烦恼的部分是baseObject原型的定义被定义为对象文字,因此我不确定覆盖其成员之一的语法,即,以下内容是否有效?

function childObject() {}

childObject.prototype = baseObject.Create() // would this inherit from baseObject?
// or should it be: childObject.prototype = new baseObject();

// this is the part thats confusing me as the syntax 
// doesn't quite match the original base objects prototype 
// syntax and I'm unsure if that will matter
childObject.prototype.myMethod = function myMethodFn() {
    return this.myMember1 - this.myMember2;
} 

childObject.Create = function childObjectCreateFn
{
    var o = new childObject();
    return o;
}

var aChildObject = childObject.Create()
var anotherValue = aChildObject.myMethod() // would this return -1 as expected?

总而言之,我正在尝试创建一个对象,该对象将通过从基础对象继承功能并对其进行更改来覆盖基础对象中存在的功能,我该怎么做? 谢谢你的时间。

你说得对。

至于语法上的混淆,两者之间并没有真正的区别

thing.prototype.myMethod = function () { ... }

thing.prototype = { myMethod: function() { ... } };

除了在第二个实例中一次设置所有原型(设置为对象常量 )的事实之外,如果再次进行设置,则将立即用新的对象常量覆盖原型。 但是,因为它是一个对象常量,所以您不能以这种方式进行继承(用大括号{ ... }声明的所有内容只是没有特殊类型的Object的实例)。 如果您坚持使用第一种语法,那么一切都会好起来的。

请注意,当您放置:

childObject.prototype.myMethod = function myMethodFn() { ... }

实际上,放置myMethodFn的部分将被忽略。 该函数被命名为myMethod ,因为它是您在其中分配的。

同样,您在哪里

childObject.Create = function childObjectCreateFn

您不需要childObjectCreateFn (它会被忽略),并且您需要在function后的某处放置括号() ,否则这是语法错误。

继续说明其起作用的原因,Javascript中创建的每个对象都有一个原型。 当您在该对象上调用方法时,它首先在对象本身内部进行查看,以查看是否存在与该方法名称相对应的键。 如果不是,它将在原型对象中查找相同的对象,如果不存在,则转到该对象的原型,依此类推,直到到达没有原型的根Object为止。

通过这种方式,您可以仅通过将实现命名为同一事物来覆盖实现,但要使其早出现在原型链中。 这就是您在childObjectchildObject 它保留了baseObject的功能,因为您创建了baseObject的实例作为childObject的原型。 然后,使用同名的新方法扩充了childObject的原型,但该方法早于原型链。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM