2011-03-09 35 views
5

Javascript'te kolayca genişletilebilir bir form sistemi tasarlamaya çalışıyorum, ancak bazı sorunları çözüyorum.Tasarım soruları: Javascript'te polimorfizm

Yemek tariflerini doldurabileceğiniz, onları bir sıraya koyabildiğiniz bir web formu düşünün ve ardından bir şefin yemek yapmasını isteyin. Ardından, 3 yemek tarifiniz olduğunu varsayalım: salata, meze ve ana yemek. Açıktır ki her form farklı sayıda alana ve farklı biçimlere sahip olacaktır.

Yapmaya çalıştığım şey temelde Recipes'ı temel alan ve .saveForm(), .fillForm() veya createNewForm() gibi çeşitli şeyleri çağıran genel bir form yöneticisidir. türetilmiş sınıflarda uygulanacak bu şeylerden her birini beğenirim.

Bu OO yapısını Javascript'te uygulamak için en iyi yol nedir? Yoksa bunu yapmanın doğru yolu değil mi? Biraz kod yazdıktan sonra kendimi türlerimi kendim atandığımı ve elle tip kontrolü yapmayı öğrendiğimi buldum, ancak bu durumun genişletilmesi zorlaşıyor. İşte

cevap

2

ne yapardım geçerli:

var Class = function (Parent, props) { 
    var Child, F, i; 

    Child = function() { 
     if (Child.uber && Child.uber.hasOwnProperty("__construct")) { 
      Child.uber.__construct.apply(this, arguments); 
     } 
     if (Child.prototype.hasOwnProperty("__construct")) { 
      Child.prototype.__construct.apply(this, arguments); 
     } 
    }; 

    Parent = Parent || Object; 
    F = function() {}; 
    F.prototype = Parent.prototype; 
    Child.prototype = new F(); 
    Child.uber = Parent.prototype; 
    Child.prototype.constructor = Child; 

    for (i in props) { 
     if (props.hasOwnProperty(i)) { 
      Child.prototype[i] = props[i]; 
     } 
    } 

    return Child; 
}; 

var Recipe = Class(null, { 
    __construct: function (name) { 
     this.name = name; 
    }, 
    getName: function() { 
     return this.name; 
    } 
}); 

var Salad = Class(Recipe, { 
    __construct: function (name) { 
     this.name = name; 
    }, 

    getName: function() { 
     var name = Salad.uber.getName.call(this); 
     return name; 
    } 
}); 

Yani bu örnekte, biz javascript normalde mevcut olandan sahte daha yapılandırılmış nesne yönelimli yaklaşıma Sınıf işlevini kullanın.

Recipe sınıfını bir kurucu ve bir örnek yöntemle tanımlarız. Daha sonra Recipe sınıfının özelliklerini ve yöntemlerini miras alan Salad sınıfını oluştururuz ve sonra getName yöntemini yeniden tanımlarız. Bu yöntemde, bu yöntemin üst sınıf uygulamalarına erişmek için statik bir özellik kullanırız.

Bu kod, hakkında daha fazla bilgi edinmek isterseniz, Stoyan Stefanov'un "JavaScript Kalıpları" nda sunulan örneklere dayanmaktadır.