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

如何从基本对象继承函数并在javascript中覆盖它,javascript,inheritance,prototype,turbulenz,Javascript,Inheritance,Prototype,Turbulenz,我想做的是让一个子对象为一个基对象中定义的函数提供它自己的实现。据我所知,到目前为止,原型是实现这一点的最佳(唯一!)方法 另外请注意,我目前正在使用游戏引擎进行开发:因此,我正试图尽可能地遵循/坚持他们的风格。在引擎中,“类”/对象按以下方式定义和创建 function baseObject() { } baseObject.prototype = { myMember1: 1, myMember2: 2, myMethod: function myMethodFn

我想做的是让一个子对象为一个基对象中定义的函数提供它自己的实现。据我所知,到目前为止,原型是实现这一点的最佳(唯一!)方法

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

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函数,例如减去两个成员值而不是相加

我说我必须创建另一个对象,然后改变它的原型,这对吗?最让我头疼的是,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 () { ... }

除了在第二个示例中,您将一次全部设置原型(设置为),如果再次设置,您将使用新的对象文本一次全部覆盖原型。但是因为它是一个对象文本,所以不能以这种方式进行继承(使用裸括号
{…}
声明的所有内容都只是没有特殊类型的
对象的一个实例)。如果你坚持第一种语法,你就永远不会有问题

请注意,当您放置:

childObject.prototype.myMethod = function myMethodFn() { ... }
放置
myMethodFn
的部分实际上被忽略。函数名为
myMethod
,因为这是您分配它的地方

同样地,你有

childObject.Create = function childObjectCreateFn
您不需要
childObjectCreateFn
(它被忽略),您需要将括号
()
放在
函数
之后的某个位置,否则这是一个语法错误

继续讨论这一点的原因,Javascript中创建的每个对象都有一个原型。在该对象上调用方法时,它首先查看对象本身内部是否存在与方法名称对应的键。如果不存在,它在prototype对象中查找相同的对象,如果不存在,它将转到该对象的prototype,依此类推,直到它到达根
对象
,该对象没有prototype

通过这种方式,您只需将实现命名为相同的东西,但让它出现在原型链的前面,就可以覆盖它。这正是您在
childObject
上所做的。它保留了
baseObject
的功能,因为您创建了一个baseObject实例作为
childObject
的原型。然后,您用一个同名的新方法扩充了
childObject
的原型,但该方法在原型链中较早出现

childObject.Create = function childObjectCreateFn