Tôi đang gặp một số sự cố với JavaScript. Tôi có mã sau:JavaScript: Thêm lớp được thừa kế vào mảng không hoạt động
<html>
<head>
<title>Test</title>
<script type="text/javascript">
function Control(){
var name;
this.setName = function(newName){
name = newName;
};
this.getName = function(){
return name;
};
}
function SpecializedControl(){
}
SpecializedControl.prototype = new Control();
function Form(){
var formControls = [];
this.addControl = function(control){
formControls.push(control);
alert(formControls[0].getName());
};
}
var form = new Form();
var control1 = new SpecializedControl();
control1.setName("Control1");
form.addControl(control1);
var control2 = new SpecializedControl();
control2.setName("Control2");
form.addControl(control2);
</script>
</head>
<body>
</body>
</html>
SpecializedControl kế thừa từ lớp Điều khiển.
Hàm addControl trong lớp Biểu mẫu chỉ thêm điều khiển vào mảng.
Vấn đề là khi tôi thêm nhiều hơn một SpecializedControl, các giá trị trong mảng là loại overriden, có nghĩa là khi tôi truy cập mục đầu tiên trong mảng, mà nên là "Control1" tôi nhận được "Control2" . Control1 không nằm trong mảng nữa.
Khi tôi sử dụng cùng chức năng với đối tượng Kiểm soát làm thông số, mọi thứ hoạt động như mong đợi.
Có ai biết tại sao điều này xảy ra và có thể làm gì để sửa lỗi này không?
tôi khuyên bạn nên lựa chọn thứ hai, gọi constructor của lớp cha trong constructor lớp con. Nó có vẻ như là điều đúng đắn để làm. Tùy chọn đầu tiên yêu cầu hiển thị biến 'name' và tùy chọn thứ ba sử dụng một thư viện phụ cố gắng triển khai kế thừa dựa trên lớp thông thường như là sự thay thế thừa kế nguyên mẫu của JavaScript. –
joi sử dụng thừa kế nguyên mẫu, không phải thừa kế cổ điển –
Ồ, xấu của tôi. Tuy nhiên, '# name' chỉ là nội bộ theo quy ước và không thực sự ngăn bạn truy cập nó từ bên ngoài. Với bao đóng, bạn có thể có các biến riêng tư thực sự. –