Có ai nhận thấy hành vi này trước đây không? Điều này thực sự đã ném tôi ra ... Tôi đã mong đợi các mảng được tạo kiểu mẫu là riêng tư cho mỗi cá thể lớp chứ không phải được chia sẻ giữa tất cả các cá thể lớp.Các thành viên đối tượng Javascript được tạo mẫu như mảng trở nên được chia sẻ bởi tất cả các phiên bản lớp
Ai đó có thể xác minh rằng đây là hành vi đúng và có thể giải thích hành vi này chi tiết hơn?
Lưu ý mã nhận xét và cách nó ảnh hưởng đến hành vi của tập lệnh.
<html>
<head>
<script type="text/javascript">
function print_r(title, object) {
var output = '';
for(var key in object) {
output += key + ": " + object[ key ] + "\n";
}
output = title + "\n\n" + output;
alert(output);
}
function Sandwich() {
// Uncomment this to fix the problem
//this.ingredients = [];
}
Sandwich.prototype = {
"ingredients" : [],
"addIngredients" : function(ingArray) {
for(var key in ingArray) {
this.addIngredient(ingArray[ key ]);
}
},
"addIngredient" : function(thing) {
this.ingredients.push(thing);
}
}
var cheeseburger = new Sandwich();
cheeseburger.addIngredients([ "burger", "cheese" ]);
var blt = new Sandwich();
blt.addIngredients([ "bacon", "lettuce", "tomato" ]);
var spicy_chicken_sandwich = new Sandwich();
spicy_chicken_sandwich.addIngredients([ "spicy chicken pattie", "lettuce", "tomato", "honey dijon mayo", "love" ]);
var onLoad = function() {
print_r("Cheeseburger contains:", cheeseburger.ingredients);
};
</script>
</head>
<body onload="onLoad();">
</body>
</html>
Rất cám ơn.
Hmm ... Vâng, điều đó có ý nghĩa. Tôi đã mắc sai lầm khi mong đợi mẫu thử nghiệm hoạt động như một định nghĩa lớp. Điều khó hiểu là nếu Foo.prototype.intValue = 5, và bạn nói b.intValue = 4, a.intValue vẫn = 5. Vì vậy, nó chỉ thực sự áp dụng cho các thành viên của đối tượng/mảng của lớp. – Dan
Sau đó, một lần nữa, nếu bạn nói b.array = ['whatever'], thì a.array cũng không thay đổi. Vì vậy, nhiệm vụ rõ ràng bằng cách sử dụng toán tử "=" ghi đè lên các thuộc tính prototyped trên một đối tượng được instanced. – Dan
@Dan: Không, tôi cũng đã cho thấy trong mã của tôi rằng 'a.array = ['foo'];' sẽ không thay đổi nguyên mẫu. Nhưng trong trường hợp của bạn với số nguyên và trong trường hợp của tôi với mảng, bạn đang gán một giá trị hoàn toàn mới cho một thuộc tính. Và nếu bạn làm điều này, thuộc tính sẽ được đặt trên đối tượng thực tế. Nhưng nếu bạn làm 'a.array.push (1)', bạn không ** thiết lập thuộc tính, bạn chỉ gọi một phương thức trong mảng chứa trong 'a.array'. Bạn không thay đổi tham chiếu. –