Javascript 使用extend克隆时如何更新此原始文件

Javascript 使用extend克隆时如何更新此原始文件,javascript,jquery,clone,Javascript,Jquery,Clone,我正在尝试使用jquery扩展方法克隆一些对象。但是,在克隆我的对象之后,我意识到克隆对象的某些方法正在修改原始对象的值,因此我认为两个对象属性可能指向同一个变量 在运行了一些测试之后,我发现克隆对象的属性被正确复制了。。。包括本地self变量(用于保存对类实例的原始this的引用)。由于克隆的self仍指向原始实例,因此引用该变量的方法将目标指向原始实例的属性,而不是其自身的实例: var Animal = function() { var self = this; this.so

我正在尝试使用jquery扩展方法克隆一些对象。但是,在克隆我的对象之后,我意识到克隆对象的某些方法正在修改原始对象的值,因此我认为两个对象属性可能指向同一个变量

在运行了一些测试之后,我发现克隆对象的属性被正确复制了。。。包括本地
self
变量(用于保存对类实例的原始
this
的引用)。由于克隆的
self
仍指向原始实例,因此引用该变量的方法将目标指向原始实例的属性,而不是其自身的实例:

var Animal = function() {

  var self = this;

  this.sound = "";

  this.talk = function(){
    alert(self.sound);
  };

};

var dog = new Animal();
dog.sound = "Woof";
dog.talk(); //Woof as expected

var cat = $.extend(true, {}, dog); 
cat.sound = "Meow";
cat.talk(); //Woof... but Meow was expected
扩展方法行为确实有意义。。。但是,是否有一种通用方法来确保
self
变量引用新的克隆对象?泛型是指
self
变量可能有不同的名称(即、\u this等),我希望避免向每个类添加自定义方法来更新
self
变量


您还应该记住,
self
变量是私有的(有很多很好的理由这样保存它),因此这意味着您不能在实例之外设置它。

事实上,对于这个用例,您不需要
var self=this
构造

刚刚在这里做了一个小测试:
请查看
的范围。 那不是你一直在找的吗

var Animal = function() {

  this.sound = "";
  this.talk = function(){
      console.log(this); //Logs Animal the first time, object the second 
      console.log(this.sound); //Logs Woof and meow 
  };

};

var dog = new Animal();
dog.sound = "Woof";
dog.talk(); 

var cat = $.extend(true, {}, dog); 
cat.sound = "Meow";
cat.talk(); 
小注:通常习惯将此方法应用于对象的原型:

Animal.prototype.talk = function(){
      console.log(this); 
      console.log(this.sound);
  };

因为它使方法立即可用,而无需在每次实例化时初始化

正如阿德内奥所指出的,问题在另一个层面。即使
extend
通常被称为克隆方法,它也不是为这个目的而设计的。这个问题中提到的问题是它的局限性的一个很好的例子


作为记录,我停止使用用于克隆目的的
extend
方法,并用取自的克隆方法替换它,从而解决了我的问题。

extend
扩展对象,它不会创建新实例。我认为唯一正确的方法是创建一个新的动物,而不是复制旧的动物。。。将动物作为原型并从中创建新实例更有意义。你可以做你喜欢的次级。通过扩展将狗变成猫似乎有点奇怪。@adeneo
extend
仍然是我们谈论克隆对象时的参考方法,即使它不是克隆对象的主要目的。创建一个新实例是一个很容易实现的解决方案(在我的例子中),但我脑子里总有一个声音在说“找到一个通用的解决方案,你这个懒惰的程序员!”。但是创建一个新动物的通用而正确的解决方案是创建一个
Animal
类的新实例,而不是克隆狗,可以这么说
$.extend
不是类实例的参考,这是它通常不使用的东西。
var self=this
实际上是一个相当好的实践,因为
这个
根据范围而变化,所以如果需要在更深的范围内访问
这个
,其中
这个
会变化,将其分配给
self
,或任何变量都将允许在更深的范围内访问它。没有
self
变量,它可以正常工作,但我认为关键是要保留它,因为OP似乎需要它来做点什么?@BrandonAnzaldi我同意,我相对经常使用u.bind。但对于这个例子,它似乎没有任何作用。@adeneo可能,我不知道。但如果不是,那么解决办法很简单:-)我想你已经发现我的动物只是一个例子。正如Brandon Anzaldi所指出的,我真正的类有许多作用域级别,当您输入这些作用域时,
self
非常方便(请参见必填项)。