2011-10-05 33 views
51

Trong tất cả các bài viết được viết rằng JavaScript là một ngôn ngữ dựa trên nguyên mẫu, có nghĩa là mọi đối tượng đều có một mẫu thử nghiệm (hoặc chính xác hơn là chuỗi nguyên mẫu).Làm thế nào để truy cập nguyên mẫu đối tượng trong javascript?

Cho đến nay, tôi đã thử các đoạn mã sau:

var F = function(); 
F.prototype.member1 = 1; 
var object1 = new F(); 
console.log(object1.member1); // prints 1 

Làm thế nào tôi có thể truy cập các đối tượng nguyên mẫu của object1? Có một cách trung lập trình duyệt để làm điều đó (ý tôi là, không dựa vào tài sản __proto__? Đã xem this liên kết, nhưng có thể có những phát triển mới kể từ năm 2010) Nếu tôi không thể, bạn có thể chia sẻ vui lòng lý do đằng sau mui xe không?

+1

object1.constructor.prototype –

Trả lời

90
var f=function(); 
var instance=new f(); 

Nếu bạn biết tên của instancelớp chức năng, bạn chỉ có thể truy cập vào nguyên mẫu như:

var prototype=f.prototype; 
prototype.someMember=someValue; 

Nếu không biết:

1)

var prototype=Object.getPrototypeOf(instance); 
prototype.someMember=someValue; 

2) hoặc

var prototype=instance.__proto__; 
prototype.someMember=someValue; 

3) hoặc

var prototype=instance.constructor.prototype; // works only if constructor is properly assigned and not modified 
prototype.someMember=someValue; 

Đối với khả năng tương thích bạn có thể đặt vào mã của bạn bên cạnh (và sử dụng luôn Object.getPrototypeOf(instance) trở lại nguyên mẫu):

if(!Object.getPrototypeOf) { 
    if(({}).__proto__===Object.prototype&&([]).__proto__===Array.prototype) { 
    Object.getPrototypeOf=function getPrototypeOf(object) { 
     return object.__proto__; 
    }; 
    } else { 
    Object.getPrototypeOf=function getPrototypeOf(object) { 
     // May break if the constructor has been changed or removed 
     return object.constructor?object.constructor.prototype:void 0; 
    }; 
    } 
} 

CẬP NHẬT :

Theo ECMA-262 Phiên bản thứ 6 (tháng 6 năm 2015) __proto__ thuộc tính được chuẩn hóa làm tính năng bổ sung cho trình duyệt Web. Tất cả các phiên bản mới nhất của các trình duyệt hàng đầu đều hỗ trợ nó ngay bây giờ. Đọc thêm về __proto__:

MDN: Object.prototype.__proto__

EDMA-262 6 Edition (tháng 6 năm 2015): B.2.2.1 Object.prototype.__proto__

+0

với một nhận xét duy nhất mặc dù: '__proto__' sẽ không hoạt động trên mọi trình duyệt – BreakPhreak

+14

Không chỉ' __proto__' nhưng toàn bộ ba phương pháp trên sẽ không hoạt động trên tất cả các trình duyệt. Nhưng mã tương thích dựa trên tất cả các phương pháp này.Bổ sung, cho năm trình duyệt chính (IE, FF, Chrome, Safari, Opera) tất cả các phiên bản mới nhất của trình duyệt có hỗ trợ cho 'Object.getPrototypeOf()', và mã tương thích chỉ cần cho IE8 trở lên. –

5
var F = function(){}; 
var object1 = new F(); 
alert(object1.constructor === F); 
alert(object1.constructor.prototype === F.prototype); 
+1

Lưu ý rằng đôi khi nó không hoạt động. Ví dụ a = Function.prototype; a.constructor.prototype sẽ bằng a. Nhưng rõ ràng nguyên mẫu của một là khác nhau. Bạn có thể xác nhận rằng nguyên mẫu của một Object.prototype bằng cách kiểm tra một .__ proto__ đó là cách tốt nhất để kiểm tra nguyên mẫu. –

2
var F = function(); 
F.prototype.member1 = 1; 
F.prototype.getClass = F; 

var object1 = new F(); 
object1.member1 = 2; 

console.log(object1.getClass.prototype.member1); // prints 1 
console.log(object1.member1); // prints 2 
2

Dường như

Object.getPrototypeOf(passedObject); 

sẽ làm việc cho điều này, và tương thích với các trình duyệt hiện đại.

Sau đây là các compatibility tables on MDN

Các vấn đề liên quan