2011-01-31 25 views
5

przypuszczać mam obiektu takiego:Jak naśladować konstruktor za pomocą komponentu ES5 Object.create i literału obiektowego?

var Foo = { 
    x: 5, 
    sprite: new Image() 
} 

Problem: Chcę zainicjować tej ikonki z prawej src. Jednak kiedy używam następujące techniki utworzenia:

var f = Object.create(Foo); 

nie mam konstruktora (funkcja aka startowych) w konfiguracji sprite.src = 'cool.png';

Moje pytanie:

Jeśli używam obiektu dosłowne technika i Object.create(), kiedy mogę faktycznie zainicjować niektóre z mojego stanu wewnętrznego (jak na przykładzie new Image())

Moje rozwiązanie:

Jednak nie wiem, czy to świetny wzór. Chciałbym zrobić to "JavaScript Way", jeśli jest jakiś sposób. :)

Dzięki!

+1

Wydaje wolisz dokonać skomplikowanego kodu niż skorzystać z prostoty systemu obiektowego. – ChaosPandion

Odpowiedz

-10

Aby wyciąć długie opowiadanie: Nie próbować. Podstawową ideą Object.create jest unikanie funkcji konstruktora. Jesteś lepiej wyłączyć za pomocą tego dobrego starego wzoru:

var Foo = function (url) { 
    //this.sprite.src = url; // This will overwrite the prototype's src 
    this.sprite = new Image(); 
    this.sprite.src = url; 
}; 
Foo.prototype = { 
    x: 5, 
    sprite: new Image() // do you really want this? 
}; 

Następnie użyj new Foo zamiast Object.create.

+0

Podaj kilka argumentów, dlaczego nie powinien tego wypróbować. – a0viedo

+0

@ a0viedo Zasadniczo dlatego, że niepotrzebnie wprowadza zamieszanie w Twoim kodzie. Każda instancja 'Foo' dziedziczy metodę' create() ', która tworzy rodzeństwo. Dlaczego ktoś miałby chcieć tego? – user123444555621

+0

Dzięki tej konstrukcji każda instancja Foo odziedziczy metodę create(), która tworzy elementy podrzędne: function create() {return Object.create (this); } –

0

bym po prostu to zrobić:

function Image(src) { 
    this.src = src; 
} 

function Foo() { 
    this.x = 5; 
    this.sprite = new Image('cool.png'); 
} 
+0

Należy wspomnieć, że wymaga to "nowego" słowa kluczowego goode olde niż "Object.create" i nie tworzy łańcucha prototypów, który chce OP. – user123444555621

4

Jak mogę założyć, z tego link należy zrobić coś takiego:

function ImgInstance(src){ 
    var img=new Image(); 
    img.src=src; 
    return img; 
} 

Object.create(Foo, {sprite: {value: ImgInstance("url")}}); 
6

zrobić coś bardzo podobnego do tego, co napisałem powyżej, ale łączą je ze wzoru modułu:

var Vehicle = (function(){ 
     var exports = {}; 
     exports.prototype = {}; 
     exports.prototype.init = function() { 
       this.mph = 5; 
     }; 
     exports.prototype.go = function() { 
       console.log("Going " + this.mph.toString() + " mph."); 
     }; 

     exports.create = function() { 
       var ret = Object.create(exports.prototype); 
       ret.init(); 
       return ret; 
     }; 

     return exports; 
})(); 

Z zewnątrz, ten naraża Vehicle.create() i Vehicle.prototype. Następnie, jeśli chcę, aby pochodnym typu, mogę to zrobić:

var Car = (function() { 
     var exports = {}; 
     exports.prototype = Object.create(Vehicle.prototype); 
     exports.prototype.init = function() { 
       Vehicle.prototype.init.apply(this, arguments); 
       this.wheels = 4; 
     }; 

     exports.create = function() { 
       var ret = Object.create(exports.prototype); 
       ret.init(); 
       return ret; 
     }; 

     return exports; 

})(); 

Ten wzór pozwala mi czerpać typów bez dokonywania błąd Car.prototype = new Vehicle(), który jest nie jeśli moi konstruktorzy wziąć parametry.

Powiązane problemy