2010-03-13 23 views
2

Je l'ai utilisé Object.beget de Douglass Crockford, mais augmentèrent légèrement à:D'autres idées pour le prototypage

Object.spawn = function (o, spec) { 
    var F = function() {}, that = {}, node = {}; 
    F.prototype = o; 
    that = new F(); 
    for (node in spec) { 
    if (spec.hasOwnProperty(node)) { 
     that[node] = spec[node]; 
    } 
    } 
    return that; 
}; 

De cette façon, vous pouvez « enfanter » et augmenter d'un seul coup.

var fop = Object.spawn(bar, { 
    a: 'fast', 
    b: 'prototyping' 
}); 

En anglais, cela signifie: « Fais-moi un nouvel objet appelé « FOP » avec « bar » comme son prototype, mais changer ou ajouter les membres 'a' et « b ». Vous pouvez même imbriquer la spécification de prototype éléments plus profonds, si vous choisissez

var fop = Object.spawn(bar, { 
    a: 'fast', 
    b: Object.spawn(quux,{ 
    farple: 'deep' 
    }), 
    c: 'prototyping' 
}); 

Cela peut aider à éviter de saut dans le prototype d'un objet sans le vouloir dans un long nom de l'objet comme:.

foo.bar.quux.peanut = 'farple'; 

Si quux est p l'art du prototype et non l'objet propre de foo, votre changement de 'peanut' changera réellement le protoype, affectant tous les objets prototypés par l'objet prototype de foo.

Mais je m'égare ... Ma question est la suivante. Parce que votre spécification peut elle-même être un autre objet et que cet objet pourrait lui-même avoir des propriétés de son prototype dans votre nouvel objet - et vous pouvez vouloir ces propriétés ... (au moins vous devriez en être conscient avant de l'utiliser comme spécification) ...

Je veux être en mesure de saisir tous les éléments de toutes les chaînes de prototypes de la spécification, à l'exception de l'objet prototype lui-même ... Cela les aplatirait dans le nouvel objet.

Actuellement, je suis en utilisant ...

Object.spawn = function (o, spec) { 
    var F = function() {}, that = {}, node = {}; 
    F.prototype = o; 
    that = new F(); 
    for (node in spec) { 
    that[node] = spec[node]; 
    } 
    return that; 
}; 

Je l'utilise pour chaque objet que je prototype, mais parce que je l'utilise tellement, je suis à la recherche d'affiner vers le bas au mieux possible .. .. Je voudrais des pensées et des suggestions ...

Répondre

0

Si j'ai bien compris votre question, vous demandez comment utiliser une approche comme celle que vous avez fournie, tout en restant capable d'accéder aux propriétés du prototype sont remplacées par la spécification? Un moyen de contourner le problème des propriétés de prototype inaccessibles (substituées) consiste à les ajouter à l'objet avec la spécification, mais en les nommant espace.

Cet exemple montre comment ajouter le remplacement à l'objet en le préfixant avec un caractère de soulignement. Mettez votre nom de famille de choix à sa place! (par exemple, vous pouvez utiliser une propriété 'super' sur l'objet)

Object.spawn = function (o, spec) { 
    var F = function() {}, that = {}, node = {}; 
    F.prototype = o; 
    that = new F(); 
    for (node in spec) { 
    if("undefined" !== typeof o[node]) { 
     that['_' + node] = o[node]; 
    } 
    that[node] = spec[node]; 
    } 
    return that; 
};