Được rồi, lần đầu tiên tôi cố gắng giải thích những gì tôi đã làm không thành công một cách thảm hại. Về cơ bản tôi đang sao chép Object.create của Crockford(), ngoại trừ với các biến riêng.Ý tưởng kế thừa Javascript (phần 2)
Nếu bạn nhìn vào câu trả lời được chấp nhận ở đây How to inherit from a class in javascript?, bạn sẽ thấy Object.create là mẫu cuối cùng, mà tôi nghĩ tốt hơn phù hợp với bản chất nguyên mẫu của Javascript (đối tượng beget objects) thay vì mô phỏng thừa kế cổ điển (lớp getget objects) .
Nếu bạn xem bài viết của Wikipedia về lập trình dựa trên nguyên mẫu (http://en.wikipedia.org/wiki/Prototype-based_programming), bạn có thể xem thêm ý của tôi.
Hạn chế với Object.create() mặc dù là không có hỗ trợ cho các thành viên riêng tư. Đây là những gì tôi đề xuất:
Function.prototype.from = function(obj) {
function F() {this.parent = Object(obj);}
F.prototype = obj;
var out = new F();
this.apply(out);
return out;
};
Sau đó, bạn tạo các đối tượng như vậy:
// Create an object
var a = function() {
var private_property = 'blue';
this.public_property = 7;
this.public_method = function() {
alert(this.public_property + ' ' + private_property);
}
}.from(null); // .from() works too, but .from(null) is more revealing
// Create a new object using 'a' as the prototype
var b = function() {
var private_property = 'red';
this.public_property = 8;
}.from(a);
// See the results
a.public_method(); // Alerts '7 blue'
b.public_method(); // Alerts '8 blue' - Parent methods use parent private variables
a.public_method = function() { alert('rabbit'); };
a.public_method(); // Alerts 'rabbit'
b.public_method(); // Alerts 'rabbit'
b.public_method = function() { alert('dog'); };
a.public_method(); // Alerts 'rabbit'
b.public_method(); // Alerts 'dog' - Parent method is overwritten
Con đường tôi đã "từ" chức năng là như vậy mà khi một đối tượng cha mẹ thay đổi phương thức của nó, nếu bạn muốn ngăn thay đổi trong một phiên bản con, bạn có thể chỉ định:
trong trường hợp con.
Cũng lưu ý rằng các đối tượng được tạo cũ nihilo không được kế thừa từ Object (hasOwnProperty, v.v.). Bạn phải xác định rõ ràng điều này dưới dạng .from (Object).
Lợi ích của mô hình này:
- Memory không lãng phí cho mỗi trường hợp mới
- Nó tuân thủ một đúng nguyên chủng mẫu thừa kế
- Bạn có thể truy cập đến đối tượng phụ huynh sử dụng này. cha mẹ (điều này .__ proto__ là trình duyệt cụ thể)
- Biến riêng tư hiện tồn tại
Có một nhược điểm chính của phương pháp này mà tôi có thể nghĩ đến: cú pháp 'hàm()' có thể gây nhầm lẫn cho mọi người khi nghĩ rằng một hàm được gán cho biến thay vì một đối tượng.
Câu hỏi của tôi là, có những hạn chế khác mà tôi đang thiếu không? (Không bao gồm những hạn chế của mẫu nguyên mẫu - đó là chủ quan - nhưng chỉ thực hiện của tôi).
Bạn nên đưa ý tưởng của mình lên làm bài đăng trên blog. – Corv1nus
Các đối tượng được tạo bằng hàm "from()" của bạn thông qua một 'null' thực sự thừa hưởng từ Object. – Pointy
Rất tiếc .. phiên bản đầu tiên của bài đăng này được sử dụng \ __ proto \ __ thay vào đó và từ (null) không được kế thừa từ Object. Tôi phải đi ngay bây giờ, nhưng tôi sẽ sửa chữa sau này ... – Nick