[JS] левые кросс-объектные поля (а-ля static var в классе)
От: DPP Россия  
Дата: 22.11.06 00:51
Оценка:
Hi!

Не приятная фишка Все браузеры дают одно, так что это фишка а не баг...
может кто-нибудь объяснить вывод этого скрипта?
<script>

function cl(x){
    alert(this.i[0]+','+this.j[0]);

    this.i.push(x);
}
cl.prototype={
    i:[],
    j:[0]
}

var a=new cl(1);
var b=new cl(2);

</script>

undefined,0
1,0
Обнаружил чисто случайно. после того как раз 20 все переписал с нуля, увершал все что можно затычками и пр. Очень забавно получилось — управляешь одним объектом, а реагирует другой только по тому и нашел.


Попутно задам вопрос: вы как пишите (если пишите много)?
// 1 (-) очень много писанины, довольно слепо
//   (-) конструктор создает все поля объекта, а не берет готовый объект и инициализирует его.
function cl(){
  this.a=0;
  this.f=f;
  // объявили все поля в начале, потом конструктор и вложенные функции
  function f(){}
}


// 2 (-) ни хрена не понятно :) но чаще всего именно так
function cl(){
  this.a=0;
  // где надо там и создали поле
  this.f=function(){}
}


// 3 (+) минимум писанины, предельно структурированно и понятно
//   (-) debuger часто не может поставить breakpoint на середину функции f() (получается на весть cl.prototype=...)
//   (-) в debuger в стеке вызовов надписи про анонимную функцию, а не ее имя.
//   (-) пока это туго понимают редакторы 
//   (?) если бы ни штука о которой я писал выше, то так бы было удобнее всего. а так - прийдется переписывать 60кб убористого кода 15 классов... :crash: 
function cl(){ this._construct(); }
cl.prototype={
  a:0;
  f:function(){}
}
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.