SORU
14 Ocak 2014, Salı


C nasıl# javascript erişim değiştiricileri?

  • Özet

    C gibi sınıf tabanlı bir dilde olduğu gibi, devralma ve saklama düzgün elde etmek için javascript denedim#.

    Çirkin kısmı korumalı üyeleri sadece kapak üzerinden erişilebilir özel durumlarda birden fazla kopya var, ve bir fikir dışında özel örneklerine üyelerini yenileme yok.

    Eğer mümkünse, Function.extend Şifremi de transmit transfer kurtulmak istiyorum.

  • Hikaye

    Beriderlemelerjavascript menzili dışında olan bir kavram olabilir, ama public, protected private dikkate internal değiştirici almıyorum.

    public ve değiştiriciler elde etmek o kadar da zor değil private; ama miras protected önemli ölçüde zordur. Henüz javascript ile yapmanı tavsiye edilen bir şey değil, okuduğum makaleler en diyorözel bir karakter ile önek ve belge.

    Ama sınıf tabanlı bir dil .. this idea çaldım ve benim bir şekilde uygulanması, kodu bu yazının arka simüle etmek için javascript yapmak için kalıcı olarak görülüyorum.

    Sahne arkasındaki fikir daha yüksek bir prototip ile erişilebilirlik koymak ve kapanması ile yüksek bir erişim için.

    A, D G, görünüşe göre üç prototip

    BANxt.png

    Olarak değil olası bir nesnedir örnek bir tip de başka bir türü olan değil prototip zinciri; bu şekilde seçilen zincir protected seviye yatay ve kopya üyelerinden prototip ilan türü. Bu üyeler, daha az türetilmiş bir tür ilan daha türetilmiş bir tür için yayılan olabilir, çünkü iç içe geçmiş sınıf mümkün kılan; Şifremi transmit yöntem bunu yapmak için. Eğer A, D G kendi korumalı üyeleri, gibi görünecektir:

    bhcsI.png

    Özel örnek erişmek için kapatılması, this['']. Bir sınıf tanımlamak için bir argüman alır. Değiştiriciler sahibi sınıf bildirimi dışında açıkta olmamalı sadece sınıf tanımlayıcısı, Function.extend 22 *test kodu* 24 *olarak adlandırılır. Ayrıca this[''] bir kısayol olarak kullanılır.

    _['base'] aslında sadece temel yapıcı ınvoker, ama aynı zamanda özel örneklerinin yaratıcısıdır. Her zaman kurucular aramış olmalı böylece miras ile her kurucu için özel örnekleri ve güncellemeler this[''] oluşturur.

    Özel bir örneği kamu üyelerinin erişimine sahip olsa da, this[''] kamu üyeleri erişirken çağrılacak altında olmadığı için, onları değiştirmek için kullanılır, olmamalıdır. Ama özel örnek erişim; recent hatırlar en son erişilen özel örneği, ve eğer bir değişiklik varsa orada korunan üyeleri güncelleştirin.

    Benim soru, nasıl ferahlatıcı korumalı üyeleri bu tür kurtulabilirim? Daha iyi bir fikri olan kapatma gerçekçi daha ulaşmak için var?

    p.s.: Ben aslında Eski tarayıcılar için/özellikler .. ve eğer kullanılan yöntemler/özellikler moda çok polyfills var daha iyi olur standart dışı yöntemler kullanan bir çözüm istemiyor.


  • İşlevi.uzatın

    Function.extend=function (base, factory) {
        factory.call(initializeClass);
        updateStaticMembersOfDerivedInnerClasses(y['public'].constructor);
        transfer(y['protected'], y['public']);
        return y['public'].constructor;
    
        function y($this) {
            return $this[''](y);
        }
    
        function updateStaticMembersOfDerivedInnerClasses(outer) {
            var member, inner;
    
            for (var key in outer) {
                if (Object.prototype.hasOwnProperty.call(outer, key)?
                    (member=outer[key]) instanceof outer?
                    outer!==(inner=member.constructor):
                    false:false) {
                    transfer(inner, outer);
                }
            }
        }
    
        function initializeInstance() {
            var $this=Object.create(y['private']);
            var derivedGet=this[''];
            var recent=$this;
    
            this['']=function (x) {
                var value=y!==x?derivedGet.call(this, x):$this;
    
                if (value!==recent) {
                    transfer(value, recent, x['protected']);
                    recent=value;
                }
    
                return value;
            };
    
            base.apply(this, arguments);
            $this['']=this[''];
        }
    
        function initializeClass(derived) {
            y['public']=Object.create(base.prototype);
            y['public'].constructor=derived;
    
            if (Object.prototype.hasOwnProperty.call(base, 'transmit')) {
                base.transmit(y);
            }
            else {
                y['protected']=Object.create(y['public']);
            }
    
            derived.transmit=function (x) {
                if (x['public'] instanceof derived) {
                    x['protected']=Object.create(y['protected']);
                    x['protected'].constructor=x['public'].constructor;
                }
            };
    
            y['private']=Object.create(y['protected']);
            y['base']=initializeInstance;
            transfer(derived, base);
            derived.prototype=y['public'];
            return y;
        }
    };
    
  • transfer

    function transfer(target, source, descriptor) {
        if (target!==source?
            'undefined'!==typeof target?
            'undefined'!==typeof source:
            false:false) {
            var keys='undefined'!==typeof descriptor?descriptor:source;
    
            for (var key in keys) {
                if (Object.prototype.hasOwnProperty.call(source, key)) {
                    target[key]=source[key];
                }
            }
        }
    }
    
  • test kodu

    'use strict';
    
    var BaseClass=Function.extend(Object, function () {
        var _=this(BaseClass);
    
        var NestedClass=Function.extend(BaseClass, function () {
            var _=this(NestedClass);
    
            function NestedClass(x, y, z) {
                _['base'].apply(this, arguments);
                _(this).Y=y;
                _(this).Z=z;
            }
    
            _['public'].SetX=function (x) {
                _(this).InternalSetX(x);
            };
    
            _['public'].GetX=function () {
                return _(this).InternalGetX();
            };
    
            _['public'].GetY=function () {
                return _(this).Y;
            };
    
            _['public'].SetZ=function (z) {
                _(this).Z=z;
            };
    
            _['public'].GetZ=function () {
                return _(this).Z;
            };
    
            _['private'].Y=0;
        });
    
        function BaseClass(x) {
            _['base'].apply(this, arguments);
            _(this).X=x;
        }
    
        _['protected'].InternalSetX=function (x) {
            _(this).X=x;
        };
    
        _['protected'].InternalGetX=function () {
            return _(this).X;
        };
    
        _['private'].X=0;
        _['protected'].Z=0;
    
        BaseClass.Sample=new NestedClass(1, 2, 3);
    });
    
    var DerivedClass=Function.extend(BaseClass, function () {
        var _=this(DerivedClass);
    
        function DerivedClass(x, y, z) {
            _['base'].apply(this, arguments);
        }
    });
    
    var o=DerivedClass.Sample;
    alert(o.GetX());
    alert(o.GetY());
    alert(o.GetZ());
    o.SetX(3);
    o.SetZ(1);
    alert(o.GetX());
    alert(o.GetY());
    alert(o.GetZ());
    

CEVAP
17 Ocak 2014, Cuma


Ben de benzer bir düşünce vardı ve yazacak bir şey denemeye karar verdi. Vanilla js bir çözüm. Ama içinden ne severim hala erken. İlginç de bulabilirsiniz.

Tam olarak c değil# ama daha sıkı bir ekosistem sağlar. Ve başka basit bir çözüm js özellikleri gelişmiş.

https://github.com/iamlothian/rucksack.js

Bu kod için bir çözüm değil, ama kavramı için çözüm. Eğer Amacınız ise bu sonuç ile ilgileniyorum olarak elbette devam sonra iş için fikir almak.

Eğer beni sadece daha planlı js bir ortam istediğiniz gibi olursa, o zaman burada soru kavramları benzer hırsla yazdım.

Bölüm 2:

Burada fikir kapatma ve erişim kısıtlama kodu tanımlandıktan sonra kullanılan ve değiştirilebilir şekilde kısıtlayan bir desen oluşturmak için kullanmaktır. Çoğunlukla sabit bir sürü iş yapıldı. Ama deseni tanımlamak için bırakılır.

Burada hızlı bir alay örnek bir kamu uygulamak||özel mirası korumak olabilir nasıl gösteren. Hava ben yerleşik bir özellik olarak bu kısmı uygulamak ya da bu örnekte olduğu gibi, kullanıcıların kendi nesne onların uzantısı uygulamak bırakmaya karar vermeye çalışıyorum.

http://plnkr.co/edit/ao2hTyBV1b3nYIwr7ZS5

Uygulama scripts.js. neler olduğunu görmek için konsol görünümü.

Sırt çantası sağlar ne kod müstakil modülleri oluşturmak için bir çerçeve. Bu modüller, ad alanları ayrılmıştır ve birbirine bağlıdır. Bu bağımlılıklar tanımı sipariş gerçekten önemli değil o kadar tembel çözülmüş olarak tanımlanır. Çözüm süreci arayüzleri eşleşen ve mühürlü modül gibi diğer bazı kullanışlı özellikleri sağlar.

mevcut özellikler:

  • Modüler
  • Bağımlılık Enjeksiyon
  • Fabrika yapıcı (Nesne Örneği)
  • Servis (Statik Nesneler) kurucusu
  • Tembel yükleme
  • Kolay hata günlüğü (modüller içindeki Tüm hata yakalanır ve geçmiş olabilir)
  • Ad
  • Modüller ve AD (AD dışarıdan erişilebilir mi modülleri) kapatılabilir
  • Genel modül için olay bekliyor
  • İsteğe bağlı yapılandırma arabirimi nesnesi
  • Enjeksiyon için isteğe bağlı katı arayüzü kontrol eder

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • CruzerLite

    CruzerLite

    1 EKİM 2011
  • Damien Walters

    Damien Walte

    20 AĞUSTOS 2006
  • Mark Halberstadt

    Mark Halbers

    19 ŞUBAT 2010