2014-11-21 109 views
0

我目前正在写一个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);

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

+0

Object.create没有深入克隆,原型和构造函数的工作原理在这里解释:http://stackoverflow.com/questions/16063394/prototypical-inheritance-writing-up/16063711#16063711至于克隆对象;这是一个复杂的问题。有时候你想深入克隆成员,有时你想让它们作为其他对象的引用。 – HMR 2014-11-21 23:47:14

+0

你好,你能告诉我一些构造函数的代码吗?我不明白如何在我的情况下制作一个。难道是: VAR雇工=(函数(){ 回报{ 结构(名称){ this.name =名称|| “默认”; } NAME = “你好”; }; })( ); – Vautrinr 2014-11-22 08:21:48

+0

评论中的链接显示了几个。构造函数只是一个函数,但用new关键字调用。 – HMR 2014-11-22 10:12:28

回答

0

当你

employe2.name = Vautrin 

它会看看employe2对本身就是一个“名”属性。由于找不到它,它会在employe2对象上创建一个“名称”属性,因此代码的输出仅为“Remi”。

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

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

它创建了一个新对象,并将它的原型设置为employe。

阅读有关如何处理原型的属性查找here

+0

我很抱歉,但我认为我没有得到它。为什么雇员2没有名字财产?我怎么能解决这个问题?为什么你认为输出是“Remi”? – Vautrinr 2014-11-21 21:57:13

+0

好吧,我明白了! employe2是雇员的参考,这是参考雇员,其中有雇员的参考,是不是? 如何用Object.create克隆对象而不必重新定义每个参数? – Vautrinr 2014-11-21 22:01:59

+0

@ user3922129:employe2对雇员有'参考'。当您以阅读模式从employe2进行属性查找时,它会显示“Remi”。另一方面,如果属性查找是在写模式下完成的,它会在对象上创建一个新属性(如果尚未存在)。 – Aravind 2014-11-21 22:04:35