2013-03-07 46 views
6

Trong JavaScript, người ta nói rằng đối tượng literals có nguyên mẫu liên kết, nhưng đối tượng chức năng có cả hai nguyên mẫu liên kết và một tài sản nguyên mẫu. Vì vậy, dựa trên trên, có thể nói rằng thừa kế (trong đó sử dụng tài sản nguyên mẫu), có thể chỉ với các đối tượng chức năng (phiên bản xây dựng) và không phải với các đối tượng literals? Không.Thừa kế Javascript và đối tượng Literal

Ngoài ra, để thêm, các __proto__ tài sản là không thể truy cập vào tất cả các trình duyệt ...

+1

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ó. –

+0

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

+0

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'. –

Trả lời

2

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']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 
Các vấn đề liên quan