Javascript 使用extend克隆时如何更新此原始文件
我正在尝试使用jquery扩展方法克隆一些对象。但是,在克隆我的对象之后,我意识到克隆对象的某些方法正在修改原始对象的值,因此我认为两个对象属性可能指向同一个变量 在运行了一些测试之后,我发现克隆对象的属性被正确复制了。。。包括本地Javascript 使用extend克隆时如何更新此原始文件,javascript,jquery,clone,Javascript,Jquery,Clone,我正在尝试使用jquery扩展方法克隆一些对象。但是,在克隆我的对象之后,我意识到克隆对象的某些方法正在修改原始对象的值,因此我认为两个对象属性可能指向同一个变量 在运行了一些测试之后,我发现克隆对象的属性被正确复制了。。。包括本地self变量(用于保存对类实例的原始this的引用)。由于克隆的self仍指向原始实例,因此引用该变量的方法将目标指向原始实例的属性,而不是其自身的实例: var Animal = function() { var self = this; this.so
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
扩展对象,它不会创建新实例。我认为唯一正确的方法是创建一个新的动物,而不是复制旧的动物。。。将动物作为原型并从中创建新实例更有意义。你可以做你喜欢的次级。通过扩展将狗变成猫似乎有点奇怪。@adeneoextend
仍然是我们谈论克隆对象时的参考方法,即使它不是克隆对象的主要目的。创建一个新实例是一个很容易实现的解决方案(在我的例子中),但我脑子里总有一个声音在说“找到一个通用的解决方案,你这个懒惰的程序员!”。但是创建一个新动物的通用而正确的解决方案是创建一个Animal
类的新实例,而不是克隆狗,可以这么说$.extend
不是类实例的参考,这是它通常不使用的东西。var self=this
实际上是一个相当好的实践,因为这个
根据范围而变化,所以如果需要在更深的范围内访问这个
,其中这个
会变化,将其分配给self
,或任何变量都将允许在更深的范围内访问它。没有self
变量,它可以正常工作,但我认为关键是要保留它,因为OP似乎需要它来做点什么?@BrandonAnzaldi我同意,我相对经常使用u.bind。但对于这个例子,它似乎没有任何作用。@adeneo可能,我不知道。但如果不是,那么解决办法很简单:-)我想你已经发现我的动物只是一个例子。正如Brandon Anzaldi所指出的,我真正的类有许多作用域级别,当您输入这些作用域时,self
非常方便(请参见必填项)。