2013-02-22 74 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而不是自己編寫。

乾杯!

相關問題