JavaScript
Sözdizimi > Daha gelişmiş örnek

/* İki sayının en küçük ortak katını (LCM) bulur */
function LCMCalculator(x, y) { // yapıcı/kurucu fonksiyon
    if (isNaN(x*y)) throw new TypeError("Sayısal olmayan bağımsız değişkenlere izin verilmemektedir.");
    const checkInt = function(x) { // iç fonksiyon
        if (x % 1 !== 0)
            throw new TypeError(x + " bir tam sayı değil");

        return x;
    };

    this.a = checkInt(x)
    //   noktalı virgül kullanımı ^^^^ isteğe bağlıdır, yeni satır yeterlidir
    this.b = checkInt(y);
}
// Bir yapıcı/kurucu tarafından oluşturulan obje örneklerinin prototipi, 
// o yapıcı/kurucunun "prototip" özelliğidir.
LCMCalculator.prototype = { // obje değişmezi
    constructor: LCMCalculator, // bir prototipi yeniden atarken, yapıcı/kurucu özelliğini uygun şekilde ayarlayın
    gcd: function() { // en büyük ortak böleni hesaplayan yöntem
        // EÖklid algoritması:
        let a = Math.abs(this.a), b = Math.abs(this.b), t;

        if (a < b) {
            // değişkenlerin takas edilmesi
            // t = b; b = a; a = t;
            [a, b] = [b, a]; // destructuring (yıkım) atamasını kullanarak takas (ES6)
        }

        while (b !== 0) {
            t = b;
            b = a % b;
            a = t;
        }

        // Ortak Böleni (GCD) yalnızca bir kez hesaplamanız gerekir, bu nedenle bu yöntemi "yeniden tanımlayın".
        // (Aslında yeniden tanımlama değildir - örneğin kendisinde tanımlanır, 
        // böylece this.gcd, LCMCalculator.prototype.gcd yerine bu "yeniden 
        // tanımlamaya" atıfta bulunur.)
        // LCMCalculator obje üyeleri "a" ve/veya "b" sonradan değiştirilirse 
        // bunun yanlış bir sonuca yol açacağını unutmayın.
        // Ayrıca, 'gcd' === "gcd", this['gcd'] === this.gcd
        this['gcd'] = function() {
            return a;
        };

        return a;
    },

    // Obje/Nesne özellik adları, çift (") veya tek (') tırnak ile sınırlanan stringler ile belirtilebilir.
    "lcm": function() {
        // Değişken adları nesne/obje özellikleriyle çakışmaz, örneğin |lcm|, |this.lcm| değildir.
        // FP hassas sorunlarından kaçınmak için |this.a*this.b| şeklinde kullanmıyoruz
        let lcm = this.a / this.gcd() * this.b;

        // lcm'yi yalnızca bir kez hesaplamanız gerekir, bu nedenle bu metodu "yeniden tanımlayın".
        this.lcm = function() {
            return lcm;
        };

        return lcm;
    },

    // Metotlar ayrıca es6 sözdizimi kullanılarak da bildirilebilir
    toString() {
        // Değerleri birleştirmek için hem es6 şablon değişmezlerini 
        // hem de (+) operatörünü kullanma
        return `LCMCalculator: a = ${this.a}, b = ` + this.b;
    }
};

// Genel çıktı fonksiyonu tanımlayın; bu uygulama yalnızca Web tarayıcıları için çalışır
function output(x) {
    document.body.appendChild(document.createTextNode(x));
    document.body.appendChild(document.createElement('br'));
}

// Not: Dizilerin (array) map() ve forEach() metotları, JavaScript 1.6'da tanımlanmıştır.
// Burada JavaScript'in doğal fonksiyonel/işlevsel yapısını göstermek için kullanılırlar.
[
    [25, 55],
    [21, 56],
    [22, 58],
    [28, 56]
].map(function(pair) { // array literal (dizi değişmezi) + mapping function (map/eşleme fonksiyonu)
    return new LCMCalculator(pair[0], pair[1]);
}).sort((a, b) => a.lcm() - b.lcm()) // bu karşılaştırmalı fonksiyonla sıralama yapın; =>, "ok fonksiyonu" bir fonksiyonun kısa biçimidir.
    .forEach(printResult);

function printResult(obj) {
    output(obj + ", gcd = " + obj.gcd() + ", lcm = " + obj.lcm());
}
Tarayıcı penceresinde aşağıdaki çıktı görüntülenmelidir.
LCMCalculator: a = 28, b = 56, gcd = 28, lcm = 56
LCMCalculator: a = 21, b = 56, gcd = 7, lcm = 168
LCMCalculator: a = 25, b = 55, gcd = 5, lcm = 275
LCMCalculator: a = 22, b = 58, gcd = 2, lcm = 638