JavaScript prototip OO | Netgez.com
SORU
29 HAZİRAN 2011, ÇARŞAMBA


JavaScript prototip OO

TL;DR:

Prototip OO fabrika/kurucular ihtiyacımız var mı? Bir paradigma geçin ve onları tamamen bırak yapabilir miyiz?

Hikayesi:

Son zamanlarda JavaScript prototip OO yapıyor ile oynuyor oldum ve OO ™ JavaScript hazır içine klasik OO kalıpları zorluyor.

Prototip OO benim iki şey içeriyor olması. Yöntem (statik veri ve veri bağlama statik bir prototip. Fabrika veya kurucular ihtiyacımız yok.

JavaScript bu Nesnenin hazır fonksiyonlar ve Object.create içeren.

Bu prototip/statik bir plan ve doğru belge tarzı bir veritabanı içine tercihen takılı veri bağlayıcı bir soyutlama olarak her model edebiliriz anlamına gelir. I. e. nesneleri veritabanından alınan veriler ile bir prototip klonlama tarafından oluşturulur. Bu oluşturucu mantığı yok, fabrikalar yok, new hayır.

Örnek kod:

Sözde bir örnek olacaktır :

var Entity = Object.create(EventEmitter, {
    addComponent: {
        value: function _addComponent(component) {
            if (this[component.type] !== undefined) {
                this.removeComponent(this[component.type]);
            }

            _.each(_.functions(component), (function _bind(f) {
                component[f] = component[f].bind(this);
            }).bind(this));

            component.bindEvents();

            Object.defineProperty(this, component.type, {
                value: component,
                configurable: true
            });

            this.emit("component:add", this, component);
        }
    },
    removeComponent: {
        value: function _removeComponent(component) {
            component = component.type || component;

            delete this[component];

            this.emit("component:remove", this, component);
        }
    }
}

var entity = Object.create(Entity, toProperties(jsonStore.get(id)))

Küçük bir açıklama:

Özellikle kod ES5 ayrıntılı olduğu için ayrıntılı. Entity yukarıdaki plan/bir prototip. Veri ile herhangi bir gerçek nesne Object.create(Entity, {...}) kullanılarak oluşturulan olurdu.

Gerçek veri (bu durumda bileşenleri) JSON deposundan doğrudan yüklenir ve doğrudan Object.create çağrı enjekte. Tabii ki benzer bir model Object.hasOwnProperty veritabanında saklanır geçmesi bileşenleri ve sadece özellikleri oluşturmak için uygulanır.

Bir iÅŸletme, ilk kez oluÅŸturulduÄŸunda {} bir boÅŸ ile oluÅŸturulmuÅŸ

Asıl Soru:

Şimdi asıl sorularıma

  • Open source examples of JS prototypical OO?
  • Bu iyi bir fikir mi?
  • In-line prototip OOP arkasındaki fikir ve kavramları?
  • Her türlü kurucular/fabrika kullanarakfonksiyonlarkıçında bir yerlerde beni ısırmak? Gerçekten uzak kurucular kullanarak deÄŸil miyiz. Herhangi bir sınırlama fabrikalar bunları aÅŸmak gerekir nerede yukarıdaki yöntemi kullanarak.

CEVAP
29 HAZİRAN 2011, ÇARŞAMBA


Kurucu/fabrika mantık gerekli, Nesne Yönelimli Programlama hakkında nasıl düşündüğünü değiştirmek kadar uzun olduğunu sanmıyorum. Konu benim son keşif, Prototip mirası kendisi belirli verileri kullanan işlevler kümesi tanımlamak için daha çok yardımcı olduğunu keşfettim. Bu klasik miras eğitimi için yabancı bir kavram değil, ama aksama bu "ana" nesnelerin veri ameliyat olması için tanımlama yok.

var animal = {
    walk: function()
    {
        var i = 0,
            s = '';
        for (; i < this.legs; i  )
        {
            s  = 'step ';
        }

        console.log(s);
    },
    speak: function()
    {
        console.log(this.favoriteWord);
    }
}

var myLion = Object.create(animal);
myLion.legs = 4;
myLion.favoriteWord = 'woof';

Yani, yukarıdaki örnekte, bir hayvan ile birlikte gider işlevselliğini getirir ve işlevselliği olan bir nesne, veri eylemleri tamamlamak için gerekli ile birlikte oluşturun. Bu ve uzun bir süre boyunca klasik miras için kullanılan herkes için rahatsız edici garip bir his. Üye görüş kamu/özel/korumalı hiyerarşi sıcak bulanıklık yok ve bu beni sinirlendiriyor olduğunu kabul eden ilk ben olacağım.

Ayrıca, benim ilk içgüdüsü, ve üstünde başlatma myLion nesne oluşturmak için bir fabrika için hayvanlar, yani oluşturmak aslanlar ve kaplanlar ve ayılar (aman) ile basit bir işlev çağrısı. Ve, bence, birçok programcı için düşünme doğal bir şekilde - yukarıdaki kod ayrıntı çirkin ve zerafet eksikliği gibi görünüyor. Sadece klasik eğitim nedeniyle ya da yukarıdaki yöntem gerçek bir arıza olup olmadığına karar veremedim.

Şimdi, miras için.

Her zaman JavaScript inhertance zor anladım. Prototip zincirinin ins ve çıkışları gezinme tam olarak belli değil. Fonksiyon tabanlı, yeni bir anahtar kelime tüm yönlendirme denklemin alır Object.create ile bu kadar.

Hadi animal nesne yukarıdaki genişletmek ve bir insan yapmak istediğini söyledi.

var human = Object.create(animal)
human.think = function()
{
    console.log('Hmmmm...');
}

var myHuman = Object.create(human);
myHuman.legs = 2;
myHuman.favoriteWord = 'Hello';

Bu da, animal olan human bir prototip olarak bir prototip olarak var olan bir nesne oluşturur. Yeterince kolay. Hayır yanlış yönlendirme, "bir prototip işlevi prototip eşit yeni nesne". Sadece basit bir ilk miras. Basit ve anlaşılır. Polimorfizmi kolaydır.

human.speak = function()
{
    console.log(this.favoriteWord   ', dudes');
}

Nedeniyle yol prototip zincirini, myHuman.speak görülecektir human daha önce ... ... bulunan animal, ve bu nedenle bizim insan bir sörfçü yerine sadece sıkıcı, yaşlı hayvan.

Yani, sonuç olarak (TLDR):

Pseudo-klasik kurucu işlevi de bu programcılar klasik OOP eğitimi daha rahat hale getirmek için JavaScript izliyor.değil, herhangi bir yolla, gerekli, ama üye görünürlük ve (tautologically) kurucular gibi klasik kavramlar vazgeçiyorsun.

Karşılığında ne elde esneklik ve basitlik. "Sınıflar sinek - her nesne üzerine", kendisi, başka nesneler için bir şablon oluşturabilirsiniz. Ayar değerleri alt nesneler değil etkiler prototip nesneleri (Yani eğer kullandım var child = Object.create(myHuman) child.walk = 'not yet', animal.walk etkilenmeyecek olsa da - gerçekten, test).

Miras sadeliği gerçekten akıl almaz bir şey. JavaScript miras hakkında çok şey okudum, ve birçok kod satırlarını anlamaya çalışırken yazılmış. Ama gerçekten aşağı kaynarnesneler diğer nesneleri devralır. Bu kadar basit, ve new anahtar kelime, bütün bu karışıklık.

Bu esneklik, onun verdiği ölçüde kullanmak zor, ama yapmak zorundayım eminim, ama var, ve ilginç gidin. Bence en nedeni bu değil kullanılmış için büyük bir proje olduğunu sadece değil mi anlaşılır gibi olabilir, ve, IMHO, kilitli kaldık içine klasik kalıtım şekilleri hepimiz öğrendik olduğumuzu öğretti C , Java, vb.

Edit

Kurucular karşı oldukça iyi durumda olduğumu düşünüyorum. Ama fabrikalar karşı benim iddiam bulanık.

Hangi sırasında çitin her iki tarafında, flip-flop ettiğim verdim daha fazla tefekkür, sonra birkaç kez, fabrikalar da gereksiz olduğu sonucuna vardık. Eğer animal (yukarıda) başka bir fonksiyon verildiğinde initialize animal devralan yeni bir nesne oluşturmak başlatmak için önemsiz olacaktır.

var myDog = Object.create(animal);
myDog.initialize(4, 'Meow');

Yeni nesne, başlatılmış ve kullanıma hazır.

@Raynos - kesinlikle inek bu sefer beni benden çaldın. Kesinlikle yapma 5 gün için hazır hiçbir şey üretken almak gerekir.

Bunu PaylaÅŸ:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VÄ°DEO

Rastgele Yazarlar

  • HuskyStarcraft

    HuskyStarcra

    4 HAZÄ°RAN 2009
  • Kayla Caton - Peet

    Kayla Caton

    23 HAZÄ°RAN 2012
  • Ryan Billy

    Ryan Billy

    30 EKÄ°M 2006