2011-10-20 2 views
6

czytanie wprowadzający:obchodzenia konstrukcja API i OO cukier

Po wzorców opisanych powyżej tworzę Biblioteka/API w następującym

var Proto = { 
    constructor: function() { 
    this.works = true; 
    }, 
    method: function() { 
    return this.works; 
    } 
}; 

Teraz aby użytkownicy bibliotek mogli wchodzić w interakcje z moimi prototypami (które nie mają ply funkcje fabrycznych) mają do instancji i zainicjować obiektu

// instantiate 
var p = Object.create(Proto); 
// initialize 
p.constructor(); 

To jest nieprzyjazny i rozwlekły sposób zmuszając użytkowników do instancji i zainicjować swoje obiekty.

osobiście ponieważ używam pd we wszystkich moich zastosowań Mam następujący cukier

// instantiate or initialize 
var p = Proto.new(); 
// or without bolting onto Object.prototype 
var p = pd.new(Proto); 

Jednak myślę, że to niedobry zmusić pd na użytkowników, więc nie jestem pewien, co jest najlepszym sposobem, aby moje biblioteki użytkowej .

  1. Ludzie tworzenia nowych wystąpień Proto i nazywają .constructor samym sobą
  2. zmusić ludzi do korzystania pd
  3. Daj FUNKCJE fabrycznych .create styl
  4. zrezygnować i korzystać new <Function> i .prototype

1 i 2 zostały już wymienione.

3 będzie zasadniczo

Proto.create = pd.new.bind(pd, Proto); 

4 pozwoliłoby mi smutno, ale potwierdzający do znanej standardowy sposób robienia rzeczy zwiększa użyteczność.

Generalnie przy korzystaniu z niestandardowych wzorów OO, jakie są najprostsze mechanizmy umożliwiające użytkownikom korzystanie z mojej biblioteki w aplikacji?

Jestem obecnie chciałoby się powiedzieć

// here is my Prototype 
Proto; 
// here is how you instantiate a new instance 
var p = Object.create(Proto); 
// here is how you initialize it 
// yes instantiation and initialization are seperate and should be. 
p.constructor(); 
// Want sugar, use pd.new 

Odpowiedz

1

Na razie najprawdopodobniej najprościej będzie na swoich klientach bibliotecznych, jeśli użyjesz małego API, które pomoże ci zbudować tradycyjną funkcję konstruktora, używając składni, która wygląda prawie jak prototypy-klasy. Przykład użycia API:

// Superclass 
var Person = Class.extend({ 
    constructor: function (name) { 
     this.name = name; 
    }, 
    describe: function() { 
     return "Person called "+this.name; 
    } 
}); 

// Subclass 
var Worker = Person.extend({ 
    constructor: function (name, title) { 
     Worker.super.constructor.call(this, name); 
     this.title = title; 
    }, 
    describe: function() { 
     return Worker.super.describe.call(this)+" ("+this.title+")"; 
    } 
}); 
var jane = new Worker("Jane", "CTO"); 

Wdrożenia:

+0

, ale w zasadzie to jest po prostu # 4. Tworzę obiekty, które są funkcjami. Naprawdę nie chcę tego robić. – Raynos

+0

@Raynos: To prawda, ale tak właśnie robią wszyscy inni. Wolałbym, żeby wszyscy używali prototypów jako klas (PAC), ale prawdopodobnie nigdy się to nie stanie. Jednak [klasy literały] (http://wiki.ecmascript.org/doku.php?id=harmony:classes) najprawdopodobniej przejdą na ES6, a potem wszystko będzie wyglądało jak PAC. Uważam, że jest to do przyjęcia, ponieważ utrzymuje zgodność. To, co jest pod maską, jest dość przejrzyste. Po prostu nie chciałbym tego zarządzać. Jeśli ES6 zrobi to dla mnie - to dobrze. –

+0

Wybrałem opcję ["tutaj, w jaki sposób tworzysz i inicjujesz PAC] (http://raynos.org/blog/7/Doing-Object-Oriented-Javascript---part-3). Teraz, gdy wiesz, że może użyć mojego kodu, wszystko ma sens. " – Raynos

0

myślę, że droga jest realizowanie funkcji new(Prototype, [arguments]) jak na opcję „Użyj pd”. Nie powinno to być nawet takie złe z punktu widzenia zależności (ponieważ i tak można spakować tę funkcję osobno i ma tylko kilka linii kodu)

Oferuje specjalną funkcję, która pasuje również do historycznej perspektywy . Jeśli wrócisz do Smalltalk lub nawet w nowszych przypadkach, takich jak Python, masz oddzielne funkcje do tworzenia obiektów (nowe) i inicjalizacji (init, the constructor) i jedynym powodem, dla którego nie zauważamy rozdzielenia, jest to, że zapewniają syntaktyczne cukier do tworzenia obiektów.

+0

Jeżeli to '. nowa funkcja jest dodawana do każdej "klasy" prototypu, którą tworzę, czy powinna być przykręcona do 'Object.prototype.new' (i niech przeklęci programiści!). Zasadniczo, przykręcenie '.new' do wszystkich moich" klas "psuje punkt posiadania' Object.prototype.new'. – Raynos

+0

Możesz podążać za starożytną tradycją i umieścić swoje funkcje szkieletowe w głównej klasie nadrzędnej (zmuszając wszystkie klasy do dziedziczenia z niej) lub możesz po prostu utworzyć zwykłą funkcję bez metody, taką jak pd.new – hugomg

+0

Czekaj, "główna klasa nadrzędna" "" zmuszanie do dziedziczenia ". – Raynos