phiên bản ngắn:
Có: Chuỗi nguyên mẫu không thể được thiết lập hoặc sửa đổi bằng cách gán cho một thuộc tính prototype
của đối tượng. Bạn không thể thiết lập thừa kế bằng cách tạo một đối tượng với một đối tượng theo nghĩa đen và sau đó cho nó một thuộc tính được gọi là prototype
. Tài sản như vậy sẽ được gọi là prototype
, nhưng sẽ không được xem xét để thừa kế nguyên mẫu.
dài:
Nếu bạn truy cập vào một tài sản đó là undefined
, chuỗi thừa kế của đối tượng đó được kiểm tra. Vì vậy, nếu obj['prop']
là undefined
thì obj.prototype['prop']
sẽ được kiểm tra. Trong nhiều trình duyệt, thuộc tính prototype
được triển khai nội bộ dưới dạng thuộc tính __proto__
, nhưng đó là ngoài điểm. Thay vào đó, điểm là nếu một số tài sản là undefined
, nguyên mẫu của đối tượng được kiểm tra cho thuộc tính đó.
Như mọi người đã nói trong bình luận, chỉ có thể ban cho một đối tượng nguyên mẫu cung cấp thừa kế mô tả ở trên bằng cách gán đối tượng đó cho thuộc tính prototype
của hàm và sau đó sử dụng hàm đó làm hàm tạo.
Nhưng, thuộc tính prototype
của đối tượng được tạo bằng cách khởi tạo hàm tạo không phải là object.hasOwnProperty('prototype')
. Mặt khác, nếu bạn gán một thuộc tính prototype
cho một đối tượng, thì đối tượng đó sẽ object.hasOwnProperty('prototype')
, nhưng sau đó object.prototype
sẽ không liên quan gì đến chuỗi nguyên mẫu — nó sẽ chỉ là tài sản thông thường và sẽ xảy ra để gọi prototype
.
Để chứng minh điều này:
var foo = {};
foo.prototype = {bar: 'hello'};
console.log(foo.bar); // undefined
console.log(foo.prototype); // Object {bar: "hello"}
console.log(foo.hasOwnProperty('prototype')); // true
var Foo = function() {};
Foo.prototype = {bar: 'hello'};
var f = new Foo;
console.log(f.bar); // 'hello';
console.log(f.hasOwnProperty('bar')); // false
console.log(f.prototype); // undefined
console.log(f.hasOwnProperty('prototype')); // false
Nguồn
2013-03-08 19:47:03
Bạn không thể thay đổi nguyên mẫu của một đối tượng hiện hoặc chỉ định nguyên mẫu khi sử dụng một đối tượng theo nghĩa đen, vì vậy, nếu tôi hiểu câu hỏi của bạn một cách chính xác, tôi muốn nói có. –
Vì vậy, điều đó sẽ ám chỉ đến hầu hết các hành vi của trình duyệt (ngoại trừ một số ít như Firefox cho phép một thiết lập liên kết "__proto__") ... Vì vậy, người ta có thể nói Thừa kế có thể được thực hiện bằng cách sử dụng Object literal (nhưng chỉ trong trình duyệt cho phép thiết lập __proto__ liên kết, như Firefox)? – testndtv
Bản thân đối tượng được thừa kế từ 'Object.prototype', vì vậy bạn vẫn nhận được thừa kế, nhưng hiện tại bạn không thể thiết lập chuỗi nguyên mẫu dài hơn khi sử dụng cú pháp theo nghĩa đen như bạn có thể với các hàm tạo. Và các nhà xây dựng không phải là cách duy nhất. Thay vào đó, bạn có thể sử dụng 'Object.create'. –