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

时间:2013-02-16 03:05:42

标签: javascript inheritance prototype turbulenz

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

另请注意,我目前正在使用游戏引擎进行开发: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?

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

1 个答案:

答案 0 :(得分:1)

你说得对。

至于语法混淆,

之间没有真正的区别
thing.prototype.myMethod = function () { ... }

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

除了在第二个中你正在设置原型所有(到object literal)这一事实,如果你再次这样做,你将会覆盖带有新对象文字的原型一次。但是因为它是一个对象文字,你不能用这种方式继承(用裸括号{ ... }声明的所有东西只是Object没有特殊类型的实例)。如果你坚持使用第一种语法,那么你总是可以的。

请注意,当你把:

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

您放置myMethodFn的部分实际上已被忽略。该功能名为myMethod,因为这是您分配它的地方。

同样,你有

的地方
childObject.Create = function childObjectCreateFn

您不需要childObjectCreateFn(它已被忽略),您需要在()之后的某处放置括号function,否则会出现语法错误

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

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