0

我有这个基于 THREE.JS 的 OOP 方案,我需要知道我在未来的工作中是否会遇到问题。

var TESTOOP = TESTOOP || { VERSION: '0.1.1' };


//______________________________________________________________________
//OBJECT ROOT CLASS
//______________________________________________________________________
TESTOOP.Object = function(miId){

    //VARS________________________________
    //PRIVATE
    var enable = false;

    //PUBLIC
    this.miId = miId;


    //GETTERS & SETTERS __________________
    this.get_enable = function() {
        return enable;
    };
    this.set_enable = function(val) {
        enable = val;
    };
    this.get_miId = function() {
        return this.miId;
    };
    this.set_miId = function(val) {
        this.miId = val;
    };
};

//METHODS
TESTOOP.Object.prototype = Object.create( TESTOOP.Object.prototype );
TESTOOP.Object.prototype.testNoOverwrite = function (val) {
    console.log("Object.testNoOverwrite (val *4): " + val*4);
};
TESTOOP.Object.prototype.testOverwrite = function () {
    console.log("Object.testOverwrite ID: " + this.miId);
};
TESTOOP.Object.prototype.testOverwriteArgs = function (val) {
    console.log("Object.testOverwriteArgs (val*2): " + val*2);
};






//______________________________________________________________________
//OBJECT CLASS EXTEND & OVERWRITE METHODS
//______________________________________________________________________
TESTOOP.ObjInstance =  function (miId) {
    TESTOOP.Object.call(this, miId);
};
TESTOOP.ObjInstance.prototype = Object.create(TESTOOP.Object.prototype);


//REWRITE METHODS
TESTOOP.ObjInstance.prototype.testOverwrite = function () {
    //SUPER
    TESTOOP.Object.prototype.testOverwrite.call(this);
    console.log("TESTOOP.ObjInstance.testOverwrite ID:" + this.miId);
};
TESTOOP.ObjInstance.prototype.testOverwriteArgs = function (val) {
    //SUPER
    TESTOOP.Object.prototype.testOverwriteArgs.call(this,val);
    console.log("TESTOOP.ObjInstance.testOverwriteArgs (val*3): " + val*3);
};




//______________________________________________________________________
//INTANCE TEST
//______________________________________________________________________
var ObjInstance = new TESTOOP.ObjInstance(0.1);
ObjInstance.set_enable(true);
ObjInstance.testOverwrite();
ObjInstance.set_miId(0.2);
console.log("TESTOOP.ObjInstance, is enable: " + ObjInstance.get_enable());
ObjInstance.testOverwrite();
ObjInstance.testOverwriteArgs(1);
ObjInstance.testNoOverwrite(1);

你可以在 JSbin 中玩这个:http: //jsbin.com/apoped/1/edit

4

1 回答 1

2

从您的示例使用来看,您似乎可以使用标准的 JavaScript 对象模型:

https://developer.mozilla.org/en-US/docs/JavaScript/Guide/Details_of_the_Object_Model

这是一本有趣的读物,特别是如果您正在学习在 JavaScript 中使用 OOP。

因此,如果您打算在 JavaScript 中使用 OOP,我建议您首先使用标准模型,使用上面的链接作为指南,以及Douglas Crockford关于该主题的文章。

如果您是理论爱好者,您还可以阅读一些关于基于原型的 OOP 的经典文章(想到Henry Lieberman和 David Ungar 的无类组织程序)。

总而言之,用 Douglas Crockford 自己的话来说:

我写 JavaScript 已经 8 年了,我从来没有发现需要使用 uber 函数。超级想法在经典模式中相当重要,但在原型和功能模式中似乎是不必要的。我现在认为我早期在 JavaScript 中支持经典模型的尝试是错误的。

如果您真的必须使用基于类的 OOP,我建议您阅读 John Resig 的非常好的文章,简单的“类”实例化,它对这个主题给出了很好的微妙之处。

然后,您可能想要使用经过验证的基于类的库,而不是编写自己的库。

干杯!

于 2013-02-22T17:18:58.223 回答