2013-02-22 4 views
0

У меня есть эта схема ООП, основанная на THREE.JS, и мне нужно знать, будут ли у меня проблемы с будущей работой с этим.Является ли это хорошим примером apopach для ООП в 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

Да, у вас будут проблемы. У всех разработчиков есть проблемы с их кодом. Что именно мы должны предсказывать, чтобы ответить на ваш вопрос? –

+0

Интересно, есть ли (намного) лучший вариант для структурирования ООП в JS или если это решение работает хорошо. – karacas

+1

Это довольно стандартный шаблон в JavaScript. Единственное отличие состоит в том, что ваши конструкторы расположены в пространстве имен TESTOOP. Существует много дискуссий о разных моделях. Я бы предложил искать их, если вам нужна дополнительная информация. Но для всех «умных» подходов люди придумывают, я лично думаю, что основной образец, который вы показываете, лучше всего. –

ответ

2

Из вашего примера использует, это выглядит, как вы могли бы использовать стандартный JavaScript объектную модель:

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

Это интересно прочитайте, особенно если вы изучаете использование ООП в JavaScript.

Итак, если вы планируете использовать ООП в JavaScript, я бы предложил сначала использовать стандартную модель, используя приведенную выше ссылку в качестве руководства, а также статьи Douglas Crockford по этому вопросу.

Если вы парень теории, вы также можете прочитать несколько классических текстов о прототипе ООП (Henry Lieberman приходит в голову, а Organizing Programs Without Classes).

Подводя итог, по собственным словам Дугласа Крокфорд в:

Я пишу JavaScript в течение 8 лет, и я ни разу не нашел необходимости использовать функцию убер. Супер идея довольно важна в классическом шаблоне, но, похоже, она не нужна в прототипальных и функциональных шаблонах. Сейчас я вижу свои первые попытки поддержать классическую модель в JavaScript как ошибку.

Если вы действительно должны использовать ООП на основе классов, я рекомендую прочитать очень хорошую статью Резига в, Simple "Class" instanciation, что дает хорошие тонкости по этому вопросу.

Тогда вы можете использовать проверенную библиотеку на основе классов вместо того, чтобы писать свои собственные.

Cheers!

Смежные вопросы