_.clone
hoàn toàn khác với nhiệm vụ.
_.clone
tạo đối tượng mới và sao chép từng giá trị từ gốc sang đối tượng mới.
Bài tập chỉ trỏ một biến vào đối tượng đã tồn tại.
Giả sử bạn có con chó con. Hãy gọi anh ta Rex.
Nếu bạn đang thảo luận Rex với người nào đó, bạn sẽ gọi anh ấy là Rex hoặc có thể là "Chó". Cả hai đều là những tham chiếu đến con vật được đề cập. Một bài tập tương tự như sử dụng cụm từ khác nhau cho thú cưng của bạn:
rex = {
type: 'Dog',
age: '12 Weeks',
name: "Rex",
fixed: false,
fix: function() {
this.fixed = true;
console.log(this.name + " Fixed.");
}
};
theDog = rex;
// Note the use of `===`, which checks for object identity.
// Assignment (as above) is the whole point of `===`
if (theDog === rex) {
alert("The Dog is the Same as Rex");
}
Khi bạn thay đổi điều gì đó về một, nó thay đổi cho cả hai tài liệu tham khảo. Vì vậy, giả sử bạn "sửa chữa" Rex:
rex = {
type: 'Dog',
age: '12 Weeks',
name: "Rex",
fixed: false,
fix: function() {
this.fixed = true;
console.log(this.name + " Fixed.");
}
};
theDog = rex;
rex.fix();
alert("The Dog is " + (theDog.fixed ? "" : "not ") + "fixed");
alert("Rex is " + (rex.fixed ? "" : "not ") + "fixed");
theDog
cũng là cố định.
Bây giờ giả sử bạn đã nhân bản Rex. (Hãy giả vờ là anh ta không cố định vì lợi ích của cuộc tranh luận).
rex = {
type: 'Dog',
age: '12 Weeks',
name: "Rex",
fixed: false,
fix: function() {
this.fixed = true;
console.log(this.name + " Fixed.");
}
};
theDog = rex;
otherDog = _.clone(rex);
console.log(theDog);
console.log(rex);
console.log(otherDog);
var message = rex === theDog ? "Rex is the same as the dog" : "Rex and the dog are different";
message += "\n";
message += rex === otherDog ? "Rex is the same as the other dog" : "Rex is different from the other dog";
message += "\n";
message += rex.fixed ? "Rex is fixed" : "Rex is not fixed";
message += "\n";
message += otherDog.fixed ? "Other dog is fixed" : "Other dog is not fixed";
alert(message);
otherDog.fix();
message = rex.fixed ? "Rex is fixed" : "Rex is not fixed";
message += "\n";
message += otherDog.fixed ? "Other dog is fixed" : "Other dog is not fixed";
alert(message);
<script src="http://underscorejs.org/underscore-min.js"></script>
Mỗi giá trị từ rex
đã được sao chép vào otherDog
. Một cách kỳ diệu, "otherDog" được sinh ra ở tuổi 12 tuần. Nhưng sửa chữa một cái sẽ không phải sửa lỗi kia.
Bây giờ, kể từ rex
và theDog
là cùng một con chó, không cố định. Tuy nhiên, otherDog
là cố định. Ông là một bản sao, không phải cùng một con vật.
Có một số sự tinh tế cần lưu ý. _.clone
không sao chép sâu. Điều này có nghĩa là bất kỳ đối tượng hoặc mảng nào là giá trị trong đối tượng nhân bản được sao chép bằng cách gán gán cho đối tượng mới (Xem đoạn đầu tiên để xem lại ý nghĩa của điều đó).
Điều này có nghĩa là nếu rex
có thuộc tính mother
là đối tượng đại diện cho mẹ của mình, nó sẽ được chia sẻ giữa rex
và otherDog
. Mọi thay đổi đối với mẹ của rex
sẽ được phổ biến đến otherDog
. Điều này không khác với cuộc sống thực; người mẹ sinh học là một và giống nhau.
EDIT
Như một nốt kỳ diệu: nhân bản một con chó cố định tạo ra một con chó cố định. Đây là nơi ẩn dụ sinh học bị phá vỡ.
Họ làm những việc khác nhau, vì vậy nó phải là khá rõ ràng. Hay bạn không hiểu sự khác biệt? – Bergi
'simpleCopy' chỉ giữ tham chiếu. –
@Bergi có vẻ như tôi hiểu nhưng tôi chỉ cần một bí danh khác .. trong trường hợp của tôi thậm chí còn phức tạp hơn tôi có '' obj.objChild'' và tôi muốn gán '' obj.childAlias = obj.objChild'', mọi thứ hoạt động tốt , nhưng tôi chỉ đơn giản muốn biết nếu nó tốt – Kosmetika