2013-02-22 46 views
0

我有这个基于THREE.JS的OOP方案,我需要知道在未来的工作中是否会遇到问题。这是JS中面向对象的一个​​很好的例子吗?

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

+3

是的,你会遇到问题。所有开发人员都有自己的代码问题。我们应该预测什么才能回答你的问题? – 2013-02-22 16:53:53

+0

我想知道是否有更好的选择来构建JS中的OOP,或者如果这个解决方案运行良好。 – karacas 2013-02-22 17:21:24

+1

这是JavaScript中的一个非常标准的模式。唯一不同的是你的构造函数位于'TESTOOP'命名空间。有许多关于不同模式的讨论。如果您想了解更多信息,我建议您搜索一下。但是对于人们提出的所有“聪明”方法,我个人认为你展示的基本模式是最好的。 – 2013-02-22 17:25:16

回答

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的Organizing Programs Without Classes)。

综上所述,在道格拉斯·克罗克福德自己的话说:

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

如果你真的必须使用基于类的面向对象,我会建议读约翰Resig的非常漂亮的文章,Simple "Class" instanciation给出关于这个问题的很好的微妙之处。

然后你可能想要使用一个经过验证的基于类的lib而不是自己编写。

干杯!

相关问题