Javascript объектный литерал, как решить контекст? - PullRequest
2 голосов
/ 09 мая 2011

Я хотел бы начать правильно организовывать свой код, поэтому я хочу использовать объектные литералы. В следующем случае я делаю псевдо-класс. Мне бы хотелось, чтобы init() мог работать как конструктор, но, к сожалению, я не вижу, как устанавливать атрибуты на основе контекста объекта.

    var car = {
    context : this,
    wheels : 0,
    color : '',
    speed : 0,
    init : (function(x){
        console.log(x);
        x.wheels = 4;
        x.color = 'red';
        x.speed = 120;
    })(context)
};

console.log(car.color);

Ответы [ 3 ]

5 голосов
/ 09 мая 2011

Вы не можете сразу запустить такую ​​функцию, объявив литерал объекта.Что вы можете сделать:

var car = {
init : function(wheels,color,speed){
    this.wheels = wheels || 0;
    this.color = color || '';
    this.speed = speed || 0;
    return this;
  }
}.init(4,'red',120);

alert(car.speed); //=>120

Что устраняет необходимость в:

context : this,
wheels : 0,
color : '',
speed : 0,

... и предлагает возможность:

var car = {
    init : function(wheels,color,speed){
      this.wheels = wheels || 0;
      this.color = color || '';
      this.speed = speed || 0;
      return this;
     }
    },
    redAndFast = car.init(4,'red',230),
    threeWheeler = car.init(3,'yellowstriped',110);

[ edit ] Что было Я думаю?Если вам нужно больше экземпляров Car, вам придется использовать реальную constructor функцию вместо литерала объекта:

var Car = function(){
  return {
    init : function(wheels,color,speed){
            this.wheels = wheels || 0;
            this.color = color || '';
            this.speed = speed || 0;
            return this;
  }
 }
},
redAndFast = new Car().init(4,'red',230),
threeWheeler = new Car().init(3,'yellowstriped',110);

, который можно упростить до:

var Car = function(wheels,color,speed){
            this.wheels = wheels || 0;
            this.color = color || '';
            this.speed = speed || 0;
    },
    redAndFast = new Car(4,'red',230),
    threeWheeler = new Car(3,'yellowstriped',110);

Или, если вы хотите цепляться за какую-то init функцию:

var Car = (function(){
    function car(wheels,color,speed){
            this.wheels = wheels || 0;
            this.color = color || '';
            this.speed = speed || 0;
    }
    return {
        init: function(w,c,s){
            return new car(w,c,s);
        }
    };
 })(),
 redAndFast   = Car.init(4,'red',230),
 threeWheeler = Car.init(3,'yellowstriped',110);

Но, эй, что случилось с моим context?Вы можете спросить.Ну, оказывается, тебе это не нужно.Разве javascript не является красивым и гибким языком?

4 голосов
/ 09 мая 2011
var Car = function() {
    this.wheels = 4;
    this.color = 'red';
    this.speed = 120;
}

var car = new Car();

Лучше всего использовать нормальные конструкторы для таких задач.

0 голосов
/ 09 мая 2011

Объектные литералы работают для синглетонов. Если вы хотите создать экземпляр объекта, вам нужно узнать, как работает js oop, и просто использовать функциональные объекты.

...