2

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

另请注意,我目前正在使用游戏引擎进行开发: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 函数,例如减去两个成员值而不是相加。

我是否正确地说我必须创建另一个对象然后更改其原型?最让我震惊的部分是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?

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

4

1 回答 1

1

你说得对。

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

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

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

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

请注意,当您放置:

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

您放置的部分myMethodFn实际上被忽略了。该函数的命名myMethod是因为这是您分配它的位置。

同样,你有

childObject.Create = function childObjectCreateFn

你不需要childObjectCreateFn(它被忽略),你需要在后面的()某个地方加上括号,function否则它是一个语法错误。

继续说明为什么会这样,在 Javascript 中创建的每个对象都有一个原型。当您对该对象调用方法时,它首先会在对象本身内部查看是否存在与该方法名称对应的键。如果没有,它会在原型对象中查找相同的东西,如果不存在,它会转到该对象的原型,依此类推,直到它到达Object没有原型的根。

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

于 2013-02-16T04:21:25.000 回答