oo javascript со свойствами с сервера, методами из кэша, лучшей практикой? - PullRequest
1 голос
/ 25 сентября 2010

Я конвертирую процедурный JS в OO и буду признателен за любую помощь.Короче говоря, у меня есть html-страница, содержащая:

<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 и т. Д. ...

Опции, которые я выбрал:

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

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

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

// Том Джоад

Ответы [ 2 ]

1 голос
/ 25 сентября 2010
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 голосов
/ 25 сентября 2010

Решено с помощью (и исправлено несколько опечаток ...):

<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>

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

...