2016-03-31 25 views
0

JavaScript'i Düğüm ile öğreniyorum.Bir erişimci dışında bir işlev eklemek için sözdizimi nedir?

// ES6 only 
'use strict'; 

// The base object, "object literal" syntax 
let animal2 = { 
    // public member 
    animalType: 'animal', 

    // public method 
    describe() { 
    return `This is "${this.animalType}"`; 
    } 
}; 

// factory function which serves 2 purposes: 
// - encapsulation, that's where private things are declared thanks to closures 
// - the "real" object creation, this prevents to use "new" which is not really Js-ish 
let afc = function afc() { 
    // private member 
    let priv = "secret from afc"; 

    return Object.create(animal2, { 
    // Object customisation 
    animalType: { value: 'animal with create'},  

    // object extension. The new objects created here get 3 new members: 
    // - a private member 
    // - a new property 
    // - a new method to access the private member 

    // new public member 
    color: { value: 'green' }, 
    secret: { 
     get: function() { return priv; }, 
     set: function (value) { priv = value; }, 
    }, 
    KO1() { 
     console.log("KO1"); 
    }, 
    KO2: function() { 
     console.log("KO2"); 
    } 
    }); 
} 

// creation of an animal instance 
let tac = afc(); 

Benim sorunum eklemek sözdizimi ne olduğunu anlamaya olamaz: Ben fabrikaları ile nesneleri oluşturma fikir gibi ve bu konuda bir çok okuduktan sonra, ben bu kod ile nesneleri oluşturmak için seçtik Sadece bir erişimci olmasa da özel verileri işleyebilen işlev. Burada aklıma (KOx) gelen 2 örnek koymuştum, ama isimleri öne sürdüğü gibi, bu sözdizimi şu şekildedir: “KOx bir işlev değildir”.

+0

aynı sorunu) {' animal2' 'de. –

+1

"*" yeni "gerçekten Js-ish değil *" - kim sana bunu söyledi? FrédéricHamidi 'KO1 @ – Bergi

+0

() 'da en azından son düğüm versiyonları, bir yazım hatası değildir. FrédéricHamidi, DavinTryon @ –

cevap

2

Object.create ikinci değişken olarak özellik tanımlayıcıları bir nesne beklemektedir. Bu nedenle, her yerde {value: …} veya {set: …, get: …}'u kullanmanız gerekir.

Ve aslında bir yöntem için aynı şeyi olurdu - değeri gibi bir işlevle sadece standart özellik geçerli: Ancak

… 
KO3: {value: function() { 
    … 
}}, 
… 

, ben özellik tanımlayıcıları sizi kullanarak önleyeceğini Onlara ihtiyacım yok.

return Object.assign(Object.create(animal2, { 
    secret: { 
     get() { return priv; }, 
     set(value) { priv = value; }, 
    } 
}), { 
    animalType: 'animal with create', 
    color: 'green', 
    KO1() { 
     console.log("KO1"); 
    }, 
    KO2: function() { 
     console.log("KO2"); 
    } 
}); 
+0

Teşekkürler @Bergi, harika! Haklısınız, Object.create ile sözdizimi biraz ağır, Object.assign ile şeylerin nasıl çalıştığını deneyeceğim. Çok çok teşekkürler. – romu

0

Neden sadece alıcı sözdizimi kullanmayın: Object.assign daha iyi bir seçimdir?

return { 
    __proto__: animal2, // To be honest __proto__ is not a good thing to use 

    animalType: 'animal with create', 

    color: 'green', 
    get secret() { return priv; }, 
    set secret(value) { priv = value; }, 
    get KO3() { console.log("KO3"); }, 
    // or just the following, if you would like it to be a regular member function 
    // KO3() { console.log("KO3"); }, 
}; 

Veya açık __proto__ olmadan

: (açıklamak `için sözdizimi ile

const result = { 
    animalType: 'animal with create', 

    color: 'green', 
    get secret() { return priv; }, 
    set secret(value) { priv = value; }, 
    get KO3() { console.log("KO3"); }, 
}; 
Object.setPrototypeOf(result, animal2); 
return result; 
+0

AFAIK, Object.create ile bu şekilde çalışmaz. Dürüst olmaya çalıştığım ilk yol bu. – romu

+0

@romu Sure, object.create kendi giriş formatına sahiptir. Bu, sadece aynı sonucu elde edemediğiniz bir örnektir. –

+0

tamam, teşekkürler. Nesneler yaratmanın birçok yolu var, yeni gelenler için oldukça kafa karıştırıcı. – romu

İlgili konular