封闭的副本而不是引用

时间:2014-11-21 21:46:47

标签: javascript closures private accessor

我正在写一个javascript脚本。

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

我只是想知道如何复制一个完整的对象。我已经尝试过了:

 //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;
}

这是封闭代码:

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

但每当我调用一个方法时,我都会收到一个未定义函数的错误。

你能帮帮我吗? :D

第二次尝试

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 

第三次尝试

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

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

它应该是私人的;相反,它是公开的(似乎是合法的)......如何解决这个问题?

1 个答案:

答案 0 :(得分:0)

当你这样做时

employe2.name = Vautrin

它将查看employe2是否有自己的“名称”属性。由于找不到它,它会在employe2对象上创建一个“name”属性,因此代码的输出只是“Remi”。

Object.create(a,b)的工作方式是创建一个空函数,将其原型值设置为 a ,然后使用此函数创建一个新对象。将 b 中提到的属性添加到新创建的对象中。

所以当你写了Object.create(employe);

它创建了一个新对象并将其原型设置为employees。

了解如何处理原型here的属性查找。