2016-03-31 10 views
0

Ich lerne JavaScript mit Node. Ich mag die Idee von Objekten mit Fabriken zu schaffen, und nach viel zu diesem Thema zu lesen, habe ich Objekte mit diesem Code zu erstellen:Wie lautet die Syntax zum Hinzufügen einer anderen Funktion als eines Accessors?

// 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(); 

Mein Problem ist, ich kann nicht herausfinden, was die Syntax ist ein hinzufügen Funktion, die private Daten manipulieren kann und dabei nicht nur ein Accessor ist. Ich habe hier zwei Beispiele erwähnt, die mir in den Sinn gekommen sind (KOx), aber wie ihre Namen andeuten, führt diese Syntax zu: "KOx ist keine Funktion".

+0

gleiches Problem mit Syntax für 'beschreiben() {' in 'animal2'. –

+1

"*" neu "das ist nicht wirklich Js-ish *" - wer zum Teufel hat dir das erzählt? – Bergi

+0

@ FrédéricHamidi 'KO1()' ist kein Syntaxfehler, zumindest nicht in den letzten Knotenversionen. –

Antwort

2

Object.create erwartet als zweites Argument ein Objekt der Eigenschaftdeskriptoren. Deshalb müssen Sie überall {value: …} oder {set: …, get: …} verwenden.

Und in der Tat würden Sie das gleiche für ein Verfahren zu tun haben - die mit einer Funktion als Wert nur eine Standard-Eigenschaft ist:

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

Aber ich vermeiden würde mit Eigenschaftendeskriptoren, wenn Sie brauche sie nicht. Object.assign ist eine bessere Passform:

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

Danke @Bergi, wunderbar !! Du hast Recht, die Syntax mit Object.create ist ein bisschen schwer, ich werde versuchen, wie es mit Object.assign aussieht. Vielen, vielen Dank. – romu

0

Warum einfach nicht die Getter-Syntax verwenden?

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"); }, 
}; 

oder ohne explizite __proto__:

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

Da AFAIK, funktioniert es nicht mit Object.create. Dies ist die erste Art, wie ich ehrlich zu sein versuchte. – romu

+0

@romu Sicher, object.create hat ein eigenes Eingabeformat. Dies ist nur ein Beispiel, wie Sie das gleiche Ergebnis ohne object.create erreichen konnten –

+0

ok, danke. Es gibt so viele Möglichkeiten, Objekte zu erstellen, es ist ziemlich verwirrend für Neulinge. – romu

Verwandte Themen