2011-10-05 15 views
51

सभी लेखों में यह लिखा गया है कि जावास्क्रिप्ट प्रोटोटाइप-आधारित भाषा है, जिसका अर्थ है कि प्रत्येक ऑब्जेक्ट में प्रोटोटाइप (या, अधिक सटीक, प्रोटोटाइप श्रृंखला) होता है।जावास्क्रिप्ट में ऑब्जेक्ट प्रोटोटाइप का उपयोग कैसे करें?

अब तक, मैं निम्नलिखित कोड का टुकड़ा की कोशिश की है:

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

मैं कैसे object1 के प्रोटोटाइप वस्तु का उपयोग कर सकते हैं? क्या ऐसा करने के लिए एक ब्राउज़र-तटस्थ तरीका है (मेरा मतलब है, __proto__ संपत्ति पर निर्भर नहीं है? this लिंक देखा गया है, लेकिन शायद 2010 से नए विकास हुए हैं) यदि मैं नहीं कर सकता, तो क्या आप हुड के पीछे तर्क को साझा कर सकते हैं?

+1

object1.constructor.prototype –

उत्तर

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

आप instanceवर्ग समारोह के नाम, तो आप बस प्रोटोटाइप के रूप में उपयोग कर सकते हैं पता है:

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

तो पता नहीं:

1)

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

2) या

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

3) या

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

अनुकूलता आप अपने कोड अगले में जगह कर सकते हैं (और हमेशा Object.getPrototypeOf(instance) का उपयोग प्रोटोटाइप वापस जाने के लिए) के लिए:

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

अद्यतन :

ईसीएमए -262 6 वें संस्करण (जून 2015) के अनुसार __proto__ संपत्ति वेब ब्राउज़र के लिए अतिरिक्त सुविधा के रूप में मानकीकृत है। शीर्ष ब्राउज़रों के सभी नवीनतम संस्करण अब इसका समर्थन करते हैं। और पढ़ें __proto__ के बारे में:

MDN: Object.prototype.__proto__

EDMA-262 6 संस्करण (जून 2015): B.2.2.1 Object.prototype.__proto__

+0

एक टिप्पणी के साथ हालांकि: '__proto__' प्रत्येक ब्राउज़र में काम नहीं करेगा – BreakPhreak

+14

न केवल' __proto__' बल्कि पूरे तीन से अधिक विधियां सभी ब्राउज़रों में काम नहीं करेंगी। लेकिन संगतता कोड इन सभी तरीकों पर आधारित है।पांच प्रमुख ब्राउज़रों (आईई, एफएफ, क्रोम, सफारी, ओपेरा) के लिए Additionaly, ब्राउज़र के सभी अंतिम संस्करणों में 'Object.getPrototypeOf() 'के लिए समर्थन है, और संगतता कोड केवल IE8 और पुराने के लिए आवश्यक है। –

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

ध्यान दें कि कभी कभी यह काम नहीं करता है। उदाहरण के लिए एक = Function.prototype; a.constructor.prototype ए के बराबर होगा। लेकिन स्पष्ट रूप से एक प्रोटोटाइप अलग है। आप पुष्टि कर सकते हैं कि एक .__ proto__ की जांच करके ऑब्जेक्ट.प्रोटोटाइप का प्रोटोटाइप प्रोटोटाइप की जांच करने का सबसे अच्छा तरीका है। –

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

ऐसा लगता है कि

Object.getPrototypeOf(passedObject); 

की तरह इस के लिए काम करेंगे, और आधुनिक ब्राउज़रों के साथ संगत है।

यहाँ compatibility tables on MDN

संबंधित मुद्दे