2010-09-25 5 views
1

Я конвертирую процедурный JS в OO и буду признателен за любую помощь. В двух словах, что у меня есть это HTML-страница, содержащая:oo javascript со свойствами сервера, методами из кеша, лучшей практикой?

<script type="text/javascript"> 
    var serverTime='11:32:20'; //time generated by server (php) 
</script> 
<script scr="myProcFuncs.js" type="text/javascript"> 
    /* which is containing procedural functions such as 
    function getServerTime() {return window.serverTime;} 
    */ 
</script> 

То, что я хотел сделать, это убирать, без увеличения трафика, более или менее ...

<script type="text/javascript"> 
    function myOb() { 
    this.serverTime = '11:32:20'; 
    this.serverDate = '2010-09-24'; 
    } 
    //first question, need/recommended to create a class?? 
    var myCl = myOb(); 
</script> 
<script scr="myMethods.js" type="text/javascript"> 
    //second question, how to append methods to initiated class or object? 
</script> 

Что Я прошу не только то, что работает, но и лучшая практика в OO-JS. Пожалуйста, также рассмотривать задержка загрузки внешних myMethods.js и так далее ...

Опции Я concidering являются:

  • § 1, в качестве примера, добавить методы инициированного класса (или статический объект, если возможно), и если да, отправьте пример метода добавления.

  • §2 (наихудший случай) используют два объекта, один для свойств (сгенерированный сервером) и один для методов.

Благодарный для любого света в этом вопросе, все самое лучшее

// Том Джоад

ответ

0

Решенный на данный момент с (и исправлен ряд опечаток ...):

<script type="text/javascript"> 
    function myCl() { 
    this.serverTime = '11:32:20'; 
    this.serverDate = '2010-09-24'; 
    } 
    var myOb = new myCl(); 
</script> 
<script scr="myMethods.js" type="text/javascript"> 
    /* myMethods.js containing methods as.. 
    myOb.getTime = function() { 
    return this.serverTime; 
    } 
    */ 
</script> 

Работы. Если кто-то знает лучший способ, напишите.

1
function myOb() { 
    this.serverTime = '11:32:20'; 

Это не работает. this имеет смысл только в функции, если он называется методом для объекта или с оператором new.

Если вы просто делаете myOb() вместо new myOb(), то this будет глобальный (window) объект и назначение this.serverTime эффективно создавать глобальные переменные, что вы пытаетесь избежать в первую очередь. (Также без возвращаемого значения функции, myCl будет undefined.)

Поскольку вы действительно кажется, не делать ничего, что требует нескольких экземпляров или прототипов, забыть функцию и просто использовать литерал объекта:

var pageValues= { 
    serverTime: '11:32:20', 
    serverDate: '2010-09-24' 
}; 

вы можете с легкостью генерировать код, подобный этому, с помощью кодера JSON на стороне сервера. Например, если серверный язык вы используете, были PHP:

<?php 
    $pageValues= array('serverTime'=>'11:32:20', 'serverDate'=>'2010-09-24'); 
?> 
<script type="text/javascript"> 
    var pageValues= <?php echo json_encode($pageValues); ?>; 
</script> 

как добавить методы к инициированному классу или объекту?

Используйте выражение инлайн функции:

pageValues.someMethod= function() { 
    ...do something... 
}; 

Однако я не уверен, что это на самом деле получает вам что-нибудь. JavaScript - это смешанный язык сценариев, вам не нужно думать, как Java, и пытаться заставить все в объекты и классы. (Тем более, что вы на самом деле не получаете классы, и вам нужно катиться самостоятельно, используя прототипы.)

+0

Шляпы от Бобинца, для вашего времени, знания и очень хорошо изложенный ответ! – Teson

+0

Вы правы, забыв о «новой» опечатке. В любом случае, согласно http://www.crockford.com/javascript/inheritance.html (аргумент ch. Object), можно назначить новые методы для объекта. Но опять же, мабы не лучший инструмент для работы. – Teson