【问题标题】:Copy of a closure instead of a reference闭包的副本而不是引用
【发布时间】:2015-01-20 03:55:10
【问题描述】:

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

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

【问题讨论】:

  • Object.create 没有深度克隆,原型和构造函数如何工作在这里解释:stackoverflow.com/questions/16063394/… as for cloning objects;这是一个复杂的问题。有时您想深度克隆成员,有时您想将它们作为对其他对象的引用。
  • 你好,你能告诉我一些构造函数的代码吗?我不明白如何在我的情况下制作一个。会是: var Employe = (function(){ return {Construct(name){ this.name = name || "default"; } name = "Hello"; }; })();
  • 评论中的链接显示了几个。构造函数只是一个函数,但使用 new 关键字调用。
  • 所以我有一个新问题:如何使属性“私有”?
  • 我从来没有这样做过,但是有一个指向受保护模式的链接,它也应该涵盖如何模拟私有成员。

标签: javascript closures private accessor


【解决方案1】:

当你这样做时

employe2.name = Vautrin

它将查看employee2 本身是否具有“名称”属性。由于找不到,它在employee2 对象上创建了一个“name”属性,因此您的代码输出仅为“Remi”。

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

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

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

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

【讨论】:

  • 很抱歉,我想我没听懂。为什么employee2 没有name 属性?我怎么能解决这个问题?为什么你会认为输出是“Remi”?
  • 好的,我明白了! employee2 是对employe 的引用,它是对employe 的引用,它具有对employe 的引用,不是吗?如何在不必重新定义每个参数的情况下使用 Object.create 克隆对象?
  • @user3922129:employee2 有一个对employee 的“参考”。当您在读取模式下从employee2 进行属性查找时,它会显示“Remi”。另一方面,如果属性查找是在写入模式下完成的,它会在对象(我们正在处理的)上创建一个新属性(如果尚未存在)。
  • @user3922129:很抱歉,我无法理解您的要求。
猜你喜欢
  • 2013-12-16
  • 2010-09-13
  • 1970-01-01
  • 1970-01-01
  • 2018-06-08
  • 2015-06-24
  • 2013-10-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多