2013-03-27 3 views
0

Je sais que vous pouvez définir le prototype d'un nouvel objet avec cette fonction (read mozzilla docu) mais il ne crée également des propriétés propres si elle est utilisée dans un littéral d'objet comme celui-cine Object.create crée également des propriétés propres

return Object.create(this); 

Je sais aussi cette méthode à partir d'un Klass Wich littéral que les copies des méthodes d'instance

var subclass = function() { }; 
subclass.prototype = parent.prototype; 
klass.prototype = new subclass; 

surtout, je suis intéressé par la méthode object.create

EDIT

var Klass = { 
    init: function(){}, 

    prototype: { 
    init: function(){} 
    }, 

    create: function(){ 
    var object = Object.create(this); 
    console.log('object with class create'); 
    console.log(object); 
    console.log("object's parent is this"); 
    console.log(this); 
    object.parent = this; 
    object.init.apply(object, arguments); 
    console.log('returned object from create'); 
    console.log(object); 
    return object; 
    }, 

    inst: function(){ 
    var instance = Object.create(this.prototype); 
    console.log('de instance na object create'); 
    console.log(instance); 
    instance.parent = this; 
    instance.init.apply(instance, arguments); 
    console.log('arguments in inst'); 
    console.log(arguments); 
    return instance; 
    }, 

    proxy: function(func){ 
    var thisObject = this; 
    return(function(){ 
     return func.apply(thisObject, arguments); 
    }); 
    }, 

    include: function(obj){ 
    var included = obj.included || obj.setup; 
    for(var i in obj) 
     this.fn[i] = obj[i]; 
    if (included) included(this); 
    }, 

    extend: function(obj){ 
    var extended = obj.extended || obj.setup; 
    for(var i in obj) 
     this[i] = obj[i]; 
    if (extended) extended(this); 
    } 
}; 

Klass.fn = Klass.prototype; 
Klass.fn.proxy = Klass.proxy; 

merci, Richard

+0

"* copie les méthodes d'instance *" - quoi? – Bergi

+0

Donc 'create' est censé créer une sous-classe, et' inst' est supposé créer des instances de cette classe? Pourquoi les classes ont-elles besoin d'une méthode 'init'? Quelle est votre question, que voulez-vous accomplir? – Bergi

Répondre

2

MDN Object.create

Résumé

Crée un nouvel objet avec l'objet prototype spécifié et propriétés.

permet donc jeter un oeil à un exemple simple avec un objet instancié avec le mot-clé new et une avec Object.create;

function objectDotCreate() { 
    this.property = "is defined"; 
    this.createMe = function() { 
     return Object.create(this); 
    }; 
} 
var myTestObject = new objectDotCreate(); 
console.log(myTestObject, myTestObject.createMe()); 

JSBin

maintenant jeter un oeil à la sortie de la console

Console Output

gauche: new droite: Object.create

Comme vous pouvez se Les deux créent une nouvelle instance d'un objet, avec leurs propriétés.

Seulement Object.create

Crée un nouvel objet avec l'objet prototype spécifié et propriétés.

Et new (MDN)

[...] crée une instance d'un type d'objet défini par l'utilisateur ou de l'un des types d'objets intégrés qui a une fonction constructeur.

Ainsi l'instance créée en utilisant Object.create, l'accès aux gains aux propriétés, parce qu'ils sont ombré par son prototype et celui où new a été utilisé, a ses propres propriétés, définies par son constructeur.

Donc non, il ne crée pas ses propres propriétés.(Bien que vous pouvez passer d'un objet à définir directement les objets descripteurs de propriété)

+0

ok, je dois y penser, car je fais l'héritage du prototype. J'ai un modèle avec des propriétés de classe et quand je le sous-classe, avec object.create (this), il va exécuter une fonction init qui est une fonction de classe .. Je ai recommandé ma question .. – Richard

+0

il y a deux fonctions init et il exécute le class init – Richard

+0

puis dans votre exemple sortie firebug, le bon site obtient toutes les propriétés des objets et les met dans le prototype, alors l'objet ne devrait pas avoir ses propres propriétés, mais dans firebug je peux voir les propriétés/méthodes de classe pointant vers différentes versions de la fonction init .. puis il exécute la fonction init dans le contexte de la classe .. ceci est déroutant parce que object.create (this) devrait être un nouvel objet sans propriété/classe propriétés/méthodes .. – Richard

1

ne crée aussi propres propriétés

Si vous lisez le docs, il est dit Non - à moins que vous lui dites faites-le avec un deuxième argument. Son utilisation basique consiste à créer un nouvel objet vide , vide avec son prototype interne défini à l'argument. Le deuxième argument fonctionnerait comme defineProperties alors.

si elle est utilisée dans un littéral d'objet comme celui-ci

return Object.create(this);

Je ne vois pas un objet littéral, mais que vous n'utilisez pas le second paramètre l'objet renvoyé n'ont pas de propriétés propres.

+0

merci, cela peut être déroutant à moins que je colle toute la classe – Richard

Questions connexes