Tôi đang cố gắng áp dụng thừa kế nguyên mẫu cho một hàm trong Javascript. Đó là tất cả khá đơn giản và thậm chí được mô tả trong Wikipedia's javascript lemma. Nó hoạt động nếu tài sản của tôi là loại javascript đơn giản:javascript prototyped thừa kế và thuộc tính đối tượng
function Person() {
this.age = 0;
this.location = {
x: 0,
y: 0,
absolute: false
};
};
function Employee() {};
Employee.prototype = new Person();
Employee.prototype.celebrate = function() {
this.age++;
}
var pete = new Employee();
pete.age = 5;
pete.celebrate();
var bob = new Employee();
bob.celebrate();
console.log("bob is " + bob.age + " pete is " + pete.age);
Với Employee.prototype = new Person();
, tính tất cả của Người và phương pháp (prototyped) đều được thừa hưởng bởi nhân viên, trong đó là nền tảng cho thừa kế.
này hoạt động như mong đợi: bob is 1 pete is 6
Bây giờ tôi bắt đầu trở nên vớ vẩn với vị trí của Pete (sau khi ăn mừng)
pete.celebrate();
pete.location.absolute=true;
Hiển thị bob.location.absolute cho thấy: true
, đó là Contra trực quan (Tôi đã không chạm vào vị trí của bob vì vậy tôi hy vọng nó có giá trị ban đầu được khai báo trong Person
) và hủy hoại giải pháp của tôi.
Trong sự hiểu biết ban đầu của tôi, điều này phải là sai. Tôi nhận ra rằng tôi có lẽ nên nhân bản đối tượng vị trí từ người ban đầu, nhưng tôi không chắc chắn nơi hoặc làm thế nào để làm điều này. Và nếu có những kỹ thuật tốt hơn để thừa kế?
Ưu điểm của việc sử dụng createObject (Person) thay vì Person mới() là gì? Nó chỉ thêm một lớp nguyên mẫu indirection. – Kosta
@Kosta để tránh tác dụng phụ khi chạy một hàm tạo khi kế thừa. Các nhà xây dựng thường có mã khởi tạo trong đó mà bạn không muốn chạy khi bạn không khởi tạo bất kỳ thứ gì. một 'Employee' mới sẽ vẫn là' instanceof Person' bởi vì cả hai 'Person.prototype' và' f.prototype' trỏ đến cùng một đối tượng. – Esailija
Nhưng bạn vẫn đang chạy hàm tạo trong createObject() (một lần). Ngoài ra, bạn đang chạy constructor trong Employee() (trên mỗi instantiation). Bạn có thể đưa ra một ví dụ trong đó createObject() có hữu ích không? – Kosta