Birkaç benzer cevap gördüm, ancak bu yazının en iyi açıkladığını belirtmek isterim, bu yüzden sizinle paylaşmak istiyorum.
İşte onlardan alınan bazı kodlar, umarım topluluğa fayda sağlayan tam bir örnek almak için değiştirdim çünkü sınıflar için bir tasarım şablonu olarak kullanılabilir.
Ayrıca sorunuza cevap verir:
function Podcast() {
// private variables
var _somePrivateVariable = 123;
// object properties (read/write)
this.title = 'Astronomy Cast';
this.description = 'A fact-based journey through the galaxy.';
this.link = 'http://www.astronomycast.com';
// for read access to _somePrivateVariable via immutableProp
this.immutableProp = function() {
return _somePrivateVariable;
}
// object function
this.toString = function() {
return 'Title: ' + this.title;
}
};
// static property
Podcast.FILE_EXTENSION = 'mp3';
// static function
Podcast.download = function(podcast) {
console.log('Downloading ' + podcast + ' ...');
};
Bu örnek verildiğinde, statik özelliklere / işleve aşağıdaki gibi erişebilirsiniz :
// access static properties/functions
console.log(Podcast.FILE_EXTENSION); // 'mp3'
Podcast.download('Astronomy cast'); // 'Downloading Astronomy cast ...'
Ve nesne özellikleri / işlevleri basitçe şöyle:
// access object properties/functions
var podcast = new Podcast();
podcast.title = 'The Simpsons';
console.log(podcast.toString()); // Title: The Simpsons
console.log(podcast.immutableProp()); // 123
Not podcast.immutableProp () 'deki, bir sahiptir kapatma : _somePrivateVariable referans işlevi içinde tutulur.
Alıcıları ve ayarlayıcıları bile tanımlayabilirsiniz . Bu kod snippet'ine bir göz atın ( d
bir özelliği bildirmek istediğiniz nesnenin prototipi burada , y
yapıcı dışında görünmeyen özel bir değişkendir):
// getters and setters
var d = Date.prototype;
Object.defineProperty(d, "year", {
get: function() {return this.getFullYear() },
set: function(y) { this.setFullYear(y) }
});
Bu özellik tanımlar d.year
aracılığı get
ile set
belirttiğiniz yoksa - fonksiyonlar set
, daha sonra özelliği salt okunur ve değiştirilemez (bunu ayarlamaya çalışırsanız bir hata almazsınız farkında, ancak hiçbir etkisi yoktur). Her özellik özelliklere sahiptir writable
, configurable
(ilanından sonra değişikliğe izin) ve enumerable
varsayılan başınadır, (sýralayýcý olarak kullanmak için izin) false
. Bunları defineProperty
3. parametrede ayarlayabilirsiniz , örn enumerable: true
.
Geçerli olan bu sözdizimidir:
// getters and setters - alternative syntax
var obj = { a: 7,
get b() {return this.a + 1;},
set c(x) {this.a = x / 2}
};
okunabilir / yazılabilir bir özelliği a
, salt okunur bir özelliği b
ve c
bu özelliğe a
erişilebilen salt okunur bir özelliği tanımlar .
Kullanımı:
console.log(obj.a); console.log(obj.b); // output: 7, 8
obj.c=40;
console.log(obj.a); console.log(obj.b); // output: 20, 21
Notlar:
new
Anahtar kelimeyi unutmanız durumunda beklenmedik davranışlardan kaçınmak için, işleve aşağıdakileri eklemenizi öneririz Podcast
:
// instantiation helper
function Podcast() {
if(false === (this instanceof Podcast)) {
return new Podcast();
}
// [... same as above ...]
};
Şimdi aşağıdaki örneklerin her ikisi de beklendiği gibi çalışacaktır:
var podcast = new Podcast(); // normal usage, still allowed
var podcast = Podcast(); // you can omit the new keyword because of the helper
'New' ifadesi yeni bir nesne oluşturur ve tüm özellikleri ve yöntemleri kopyalar;
var a=new Podcast();
var b=new Podcast();
a.title="a"; b.title="An "+b.title;
console.log(a.title); // "a"
console.log(b.title); // "An Astronomy Cast"
Ayrıca, bazı durumlarda sınıfın dahili olarak dayandığı ancak ortaya çıkarılması gereken özel bir nesne koruma işlevlerini döndürmek return
için yapıcı işlevindeki ifadeyi kullanmanın yararlı olabileceğini unutmayın Podcast
. Bu, makale serisinin 2. bölümünde (Nesneler) daha ayrıntılı olarak açıklanmaktadır.
Bunu söyleyebilir a
ve b
miras alabilirsiniz Podcast
. Şimdi, Podcast'e sonradan hepsi için geçerli olan a
ve b
somutlaştırılmış bir yöntem eklemek isterseniz ne olacak ? Bu durumda, .prototype
aşağıdaki gibi kullanın :
Podcast.prototype.titleAndLink = function() {
return this.title + " [" + this.link + "]";
};
Şimdi diyoruz a
ve b
yine:
console.log(a.titleAndLink()); // "a [http://www.astronomycast.com]"
console.log(b.titleAndLink()); // "An Astronomy Cast [http://www.astronomycast.com]"
Prototipler hakkında daha fazla bilgiyi burada bulabilirsiniz . Daha devralma yapmak istiyorsanız, ben içine bakarak öneririz bu .
Yazı dizisi Yukarıda sözünü ettiğim edilir şiddetle tavsiye okumak için, onlar da aşağıdaki konuları içerir:
- Fonksiyonlar
- Nesneler
- prototipleri
- Yapıcı İşlevlerinde Yeniyi Zorlamak
- kaldırma
- Otomatik Noktalı virgül ekleme
- Statik Özellikler ve Yöntemler
Not olduğunu otomatik noktalı virgül ekleme (aynı 6'da belirtilen) JavaScript "özelliği" çok sık garip şifreli sorunlarına neden sorumludur. Bu nedenle, onu bir özellik olarak bir hata olarak görmeyi tercih ederim.
Daha fazla okumak isterseniz, işte bu konularla ilgili oldukça ilginç bir MSDN makalesi var, bazıları burada daha fazla ayrıntı sunuyor.
Okumak ilginç olan şey (yukarıda belirtilen konuları da kapsayan) MDN JavaScript Kılavuzu'ndaki makalelerdir :
JavaScript'te c # out
parametrelerini (içinde olduğu gibi DateTime.TryParse(str, out result)
) nasıl taklit edeceğinizi öğrenmek istiyorsanız, örnek kodu burada bulabilirsiniz .
IE ile çalışanlarınız (geliştirici araçlarını F12konsol sekmesini kullanarak açıp açmadığınız sürece JavaScript için konsolu olmayanlar ) aşağıdaki snippet'i yararlı bulabilir. console.log(msg);
Yukarıdaki örneklerde kullanıldığı gibi kullanmanıza izin verir . Sadece Podcast
fonksiyondan önce takın .
Size kolaylık sağlamak için, yukarıdaki kodu tek bir tam kod snippet'inde bulabilirsiniz:
let console = { log: function(msg) {
let canvas = document.getElementById("log"), br = canvas.innerHTML==="" ? "" : "<br/>";
canvas.innerHTML += (br + (msg || "").toString());
}};
console.log('For details, see the explaining text');
function Podcast() {
// with this, you can instantiate without new (see description in text)
if (false === (this instanceof Podcast)) {
return new Podcast();
}
// private variables
var _somePrivateVariable = 123;
// object properties
this.title = 'Astronomy Cast';
this.description = 'A fact-based journey through the galaxy.';
this.link = 'http://www.astronomycast.com';
this.immutableProp = function() {
return _somePrivateVariable;
}
// object function
this.toString = function() {
return 'Title: ' + this.title;
}
};
// static property
Podcast.FILE_EXTENSION = 'mp3';
// static function
Podcast.download = function(podcast) {
console.log('Downloading ' + podcast + ' ...');
};
// access static properties/functions
Podcast.FILE_EXTENSION; // 'mp3'
Podcast.download('Astronomy cast'); // 'Downloading Astronomy cast ...'
// access object properties/functions
var podcast = new Podcast();
podcast.title = 'The Simpsons';
console.log(podcast.toString()); // Title: The Simpsons
console.log(podcast.immutableProp()); // 123
// getters and setters
var d = Date.prototype;
Object.defineProperty(d, "year", {
get: function() {
return this.getFullYear()
},
set: function(y) {
this.setFullYear(y)
}
});
// getters and setters - alternative syntax
var obj = {
a: 7,
get b() {
return this.a + 1;
},
set c(x) {
this.a = x / 2
}
};
// usage:
console.log(obj.a); console.log(obj.b); // output: 7, 8
obj.c=40;
console.log(obj.a); console.log(obj.b); // output: 20, 21
var a=new Podcast();
var b=new Podcast();
a.title="a"; b.title="An "+b.title;
console.log(a.title); // "a"
console.log(b.title); // "An Astronomy Cast"
Podcast.prototype.titleAndLink = function() {
return this.title + " [" + this.link + "]";
};
console.log(a.titleAndLink()); // "a [http://www.astronomycast.com]"
console.log(b.titleAndLink()); // "An Astronomy Cast [http://www.astronomycast.com]"
<div id="log"></div>
Notlar:
Genel olarak JavaScript programlama hakkında bazı iyi ipuçlarını, ipuçlarını ve önerileri burada bulabilirsiniz (JavaScript en iyi uygulamaları) ve orada ('var' karşı 'let') . Örtülü daktilolar (baskı) ile ilgili bu makale de önerilmektedir .
Sınıfları kullanmanın ve JavaScript'e derlemenin kullanışlı bir yolu TypeScript'tir. İşte size nasıl çalıştığını gösteren bazı örnekler bulabileceğiniz bir oyun alanı . Şu anda TypeScript kullanmasanız bile, bir bakabilirsiniz çünkü TypeScript'i yan yana görünümde JavaScript sonucuyla karşılaştırabilirsiniz. Çoğu örnek basittir, ancak anında deneyebileceğiniz bir Raytracer örneği de vardır. Özellikle "Sınıfları Kullanma", "Devralmayı Kullanma" ve "Generics'i Kullanma" örneklerine birleşik giriş kutusunda seçerek bakmanızı öneririm - bunlar anında JavaScript'te kullanabileceğiniz güzel şablonlardır. Dizgi, Açısal ile kullanılır .
JavaScript'te yerel değişkenlerin, işlevlerin vb. Kapsüllenmesini sağlamak için aşağıdaki gibi bir desen kullanmanızı öneririm (JQuery aynı tekniği kullanır):
<html>
<head></head>
<body><script>
'use strict';
// module pattern (self invoked function)
const myModule = (function(context) {
// to allow replacement of the function, use 'var' otherwise keep 'const'
// put variables and function with local module scope here:
var print = function(str) {
if (str !== undefined) context.document.write(str);
context.document.write("<br/><br/>");
return;
}
// ... more variables ...
// main method
var _main = function(title) {
if (title !== undefined) print(title);
print("<b>last modified: </b>" + context.document.lastModified + "<br/>");
// ... more code ...
}
// public methods
return {
Main: _main
// ... more public methods, properties ...
};
})(this);
// use module
myModule.Main("<b>Module demo</b>");
</script></body>
</html>
Tabii ki, kod kodunu ayrı bir *.js
dosyaya koyabilir ve koymalısınız ; bu sadece örneği kısa tutmak için satır içi olarak yazılmıştır.
Kendiliğinden çalışan işlevler (IIFE = Hemen Çağırılan İşlev İfadesi olarak da bilinir) burada daha ayrıntılı olarak açıklanmaktadır .