Tôi khá mới sử dụng object.create thay vì cách js cổ điển để đạt được thừa kế nguyên mẫu.Object.create setting __proto__ nhưng không phải là nguyên mẫu
Trong Chrome ít nhất tôi đã ngạc nhiên khi nhìn thấy đoạn mã sau:
var baseObject = {
test : function(){
console.log('Child');
}
}
var newObject = Object.create(baseObject);
newObject.test = function(){
console.log('Parent');
this.__proto__.test();
}
console.log(newObject);
newObject.test();
Tạo này (mô phỏng đầu ra trong các công cụ web):
Object {test: function, test: function}
test: function(){
__proto__: Object
test: function(){
__proto__: Object
Parent
Child
Vì vậy, bạn thấy nó không thiết lập nguyên mẫu nhưng thay vào đó chỉ "__proto__", điều mà tôi nghĩ là không được khuyến khích trong việc sử dụng nó. Bạn có thể thấy rằng trong mã của tôi tôi có thể kế thừa đúng, và gọi đối tượng cha, nhưng chỉ sử dụng "__proto__". Sử dụng "nguyên mẫu" dẫn đến lỗi (không xác định).
Điều gì đang xảy ra ở đây? Tôi figured object.create sẽ thiết lập "nguyên mẫu" thay vì đó là tiêu chuẩn (hoặc vì vậy tôi đã giả định). Tại sao nó phổ biến và làm cho tôi sử dụng "__proto__"
Rất thú vị. Bạn đúng Tôi quên nguyên mẫu chỉ áp dụng cho các chức năng. Vì vậy, về cơ bản, ít nhất là chrome, việc sử dụng __proto__ loại nguyên mẫu sao chép cho các đối tượng kế hoạch một cách không chuẩn? – nahelm
@nahelm: Sắp xếp. '__proto__' cho phép bạn cung cấp cho một đối tượng hiện có một chuỗi nguyên mẫu mới. Hàm xây dựng và 'Object.create' chỉ cho phép bạn thiết lập nó tại thời điểm đối tượng được tạo. Từ đó nó vĩnh viễn. Trong thực tế, nếu bạn tạo một đối tượng từ hàm constructor, thì bạn cung cấp cho hàm constructor một đối tượng '.prototype' mới, đối tượng mà bạn đã tạo vẫn sẽ tham khảo nguyên gốc. Nó không bao giờ thay đổi. –
Tôi nghĩ rằng cuối cùng tôi cũng nhận được nó. Một phần của sự nhầm lẫn của tôi là tôi đã mong đợi các công cụ web của tôi trong chrome để hiển thị nguyên mẫu của đối tượng mà tôi đã tạo. Tôi cũng nghĩ cho một số lý do ngớ ngẩn rằng việc sử dụng từ khóa mới cho phép bạn sử dụng từ khóa nguyên mẫu (ví dụ: f.prototype trong ví dụ của bạn), điều này không đúng. Khi tôi đã làm ví dụ Foo của bạn và thêm một chức năng để nguyên mẫu của nó, chức năng đó cũng xuất hiện trong đối tượng __proto__ khi tôi console.log (f). Vì vậy, về cơ bản __proto__ trong trường hợp này cho thấy chuỗi nguyên mẫu thường bị ẩn và khi bạn nói vĩnh viễn. – nahelm