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

标签 javascript inheritance prototype turbulenz

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

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

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

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() { ... } };

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

请注意,当您输入:

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

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

同样,你有什么地方

childObject.Create = function childObjectCreateFn

你不需要 childObjectCreateFn (它被忽略),你需要在 function 之后的某处放置括号 () 或者它是一种语法错误。

继续讨论其工作原理,在 Javascript 中创建的每个对象都有一个原型(prototype)。当您对该对象调用方法时,它首先会在对象内部查看是否存在与该方法名称相对应的键。如果没有,它会在原型(prototype)对象中查找相同的东西,如果不存在,它会转到该对象的原型(prototype),依此类推,直到到达没有原型(prototype)的根 Object .

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

关于javascript - 如何从基础对象继承函数并在javascript中覆盖它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14906482/

相关文章:

javascript - 扩展 UI 选择 Controller ( Angular )

C++ - 继承,调用哪个基本构造函数?

javascript - 对总分区权重有限制的分区加权元素

javascript - 有时会出现模式关闭时的空白屏幕

javascript - 在 Extjs 4 中向弹出窗口添加覆盖指针?

c++ - 继承类使用继承结构

JavaScript:为什么 "for in"循环从 __proto__ 中选取变量?

javascript - 经典继承与原型(prototype)继承的区别

javascript - Object.create 和原型(prototype)

javascript - 如何将整个数组添加到 useState 变量