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 detransmit
transfer
kurtulmak istiyorum.Hikaye
Beriderlemelerjavascript menzili dışında olan bir kavram olabilir, ama
public
,protected
private
dikkateinternal
değiştirici almıyorum.public
ve değiştiriciler elde etmek o kadar da zor değilprivate
; ama mirasprotected
ö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 üç prototipOlarak 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; Şifremitransmit
yöntem bunu yapmak için. EğerA
,D
G
kendi korumalı üyeleri, gibi görünecektir:Ö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ıcathis['']
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üncellemelerthis['']
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
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
Ekran görüntüsü nasıl web sitesi istem...
Nasıl javascript bir nesne özellikleri...
Nasıl erişim FB simgesi olsun.javascri...
JavaScript kilitler nasıl çalışır?...
Nasıl bir JavaScript nesnesinin bir öz...