2011-10-05 9 views
51

Tüm makalelerde, JavaScript'in prototip tabanlı bir dil olduğu, yani her nesnenin bir prototip (veya daha kesin olarak prototip zinciri) olduğu yazılmıştır.Javascript'te nesne prototipine nasıl erişilir?

Şimdiye kadar, aşağıdaki kod parçacığını denedim:

nasıl object1 prototipi nesneye erişebilen

var F = function(); 
F.prototype.member1 = 1; 
var object1 = new F(); 
console.log(object1.member1); // prints 1 
? Bunu yapmak için tarayıcı-nötr bir yolu var mı? (Yani __proto__ mülküne güvenmiyor muyuz? Seçildi this link, ama belki 2010'dan beri yeni gelişmeler var) Eğer yapamazsam, kaputun ardındaki mantığı lütfen paylaşır mısın?

+1

object1.constructor.prototype –

cevap

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

Eğer instancesınıf fonksiyonu ismi, sadece olarak prototip erişebilir biliyorsanız: bilmiyor ise

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

:

1)

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

2) veya

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

3) ya da) prototip dönmek yanına koduna yerleştirmek (ve her zaman Object.getPrototypeOf(instance) kullanabilirsiniz uyumluluk için

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

:

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; 
    }; 
    } 
} 

GÜNCELLEME :

ECMA-262 6th Edition'a (Haziran 2015) göre __proto__ özelliği, Web tarayıcıları için ek özellik olarak standartlaştırılmıştır. En yeni tarayıcıların tüm son sürümleri şimdi destekliyor. Devamı __proto__ hakkında:

MDN'yi: Object.prototype.__proto__

EDMA-262 6th Edition (Haziran 2015): B.2.2.1 Object.prototype.__proto__

+0

tek bir yorumla olsa da: '__proto__' her tarayıcıda çalışmayacaktır – BreakPhreak

+14

Sadece' __proto__' değil, aynı zamanda üç yöntemin tamamı tüm tarayıcılarda çalışmayacaktır. Ancak uyumluluk kodu, tüm bu yöntemlere dayanmaktadır.Ek olarak, beş temel tarayıcıda (IE, FF, Chrome, Safari, Opera) tüm tarayıcı sürümlerinde Object.getPrototypeOf() 've uyumluluk kodunun yalnızca IE8 ve daha eski sürümler için destekleri vardır. –

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

Not vardır. Örneğin a = Function.prototype; a.constructor.prototype bir eşit olacaktır. Ama açıkçası a'nın prototipi farklıdır. Bir prototipin prototipini kontrol etmenin en iyi yolu olan bir protokontrolü kontrol ederek bir Object.prototype prototipinin olduğunu onaylayabilirsiniz. –

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

O

Object.getPrototypeOf(passedObject); 

bunun için çalışacak gibi görünüyor ve modern tarayıcılarla uyumludur. İşte

bazen çalışmadığını compatibility tables on MDN