Copy of a closure instead of a reference

114 Views Asked by At

I'm currently writting a javascript script.

employe.name = Remi
employe2 = Object.create(Employe);
employe2.name = Vautrin
console.log(employe.name);//Vautrin instead of Remi

I was just wondering how to copy a full object. I've already tried :

 //StackOverFlow
function clone(obj) {

    if (obj == null || typeof (obj) != 'object')
        return obj;

    var temp = obj.constructor(); // changed

    for (var key in obj) {
        if (obj.hasOwnProperty(key)) {
            temp[key] = clone(obj[key]);
        }
    }
    return temp;
}

This is the closure code :

var Employe = (function(){
    return {
        name = "Hello";
     };        
})();

But whenever I call a method, I get an error of non defined function.

Could you help me please ? :D

Second attempt

var EdT = (function() {
    var _nbJoursTravaille = 0;
    var _semaine ;
    var _proprietaire;
    return {
        constructor: function(proprietaire) {
            _proprietaire = proprietaire;

            return this;
        },
    };

});

var Employe = (function() {
    var _id;
    var _nom;
    var _prenom;
    var _metier;
    var _tel;
    var _edT ;
    return {
        constructor: function(id, nom, prenom, metier, tel) {
            _id = id;
            _nom = nom;
            _prenom = prenom;
            _metier = metier;
            _tel = tel;
            _edT= Object.create(EdT).constructor(nom + " " + prenom);
            return this;
        },
//.... Some code
     };
});

var employe = Object.create(Employe).constructor("id", "nom", "Rémi", "AlmostJsDev", "+33");
var employe2 =Object.create(Employe).constructor("id", "nom", "Rémi1234", "AlmostJsDev", "+33");
console.log(employe.getEdT().getProprietaire()); //Remi1234 

Third Attempt

var EDT = (function(){
     this.proprietaire;
     return {
       constructor : function(proprietaire){
             this.proprietaire = proprietaire;
        }
      };
})();

console.log(employe.getEdT()._proprietaire);

It should be private ; instead it's public (seems legit) ... How to fix that ?

1

There are 1 best solutions below

4
On

When you do

employe2.name = Vautrin

it will see if employe2 has a "name" property on itself. Since it could not find one, it creates a "name" property on the employe2 object, and hence the output of your code is "Remi" only.

The way Object.create(a,b) works is create a empty function, set it's prototype value to a, then create a new object using this function. Add the properties mentioned in b to the newly created object.

So when you wrote Object.create(employe);

It created a new object and set it's prototype to employe.

Read about how property lookups are handled for prototypes here.