这是JS中OOP的一个很好的示例方法吗?

时间:2013-02-22 16:37:44

标签: javascript oop class

我有这个基于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

1 个答案:

答案 0 :(得分:2)

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

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

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

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

如果你是一个理论家,你还可以阅读一些关于基于原型的OOP的经典文本(Henry Lieberman浮现在脑海中,而David Ungar的Organizing Programs Without Classes)。

总而言之,用道格拉斯·克罗克福德自己的话来说:

  

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

如果你真的必须使用基于类的OOP,我建议阅读John Resig的非常好的文章Simple "Class" instanciation,它给出了很好的细微之处。

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

干杯!