खोज…
मानक फ़ंक्शन प्रोटोटाइप
एक Foo
फ़ंक्शन को परिभाषित करके शुरू करें जो हम एक निर्माता के रूप में उपयोग करेंगे।
function Foo (){}
Foo.prototype
संपादित Foo.prototype
, हम उन गुणों और विधियों को परिभाषित कर सकते हैं, जिन्हें Foo
सभी उदाहरणों द्वारा साझा किया जाएगा।
Foo.prototype.bar = function() {
return 'I am bar';
};
फिर हम new
कीवर्ड का उपयोग करके एक उदाहरण बना सकते हैं, और विधि को कॉल कर सकते हैं।
var foo = new Foo();
console.log(foo.bar()); // logs `I am bar`
Object.key और Object.prototyp.key के बीच अंतर
पायथन जैसी भाषाओं के विपरीत, कंस्ट्रक्टर फ़ंक्शन के स्थिर गुणों को उदाहरणों के लिए विरासत में नहीं मिला है। उदाहरण केवल उनके प्रोटोटाइप से विरासत में मिलते हैं, जो मूल प्रकार के प्रोटोटाइप से विरासत में मिलते हैं। स्थैतिक गुण कभी भी विरासत में नहीं मिलते हैं।
function Foo() {};
Foo.style = 'bold';
var foo = new Foo();
console.log(Foo.style); // 'bold'
console.log(foo.style); // undefined
Foo.prototype.style = 'italic';
console.log(Foo.style); // 'bold'
console.log(foo.style); // 'italic'
प्रोटोटाइप से नई वस्तु
जावास्क्रिप्ट में, कोई भी वस्तु दूसरे का प्रोटोटाइप हो सकती है। जब किसी वस्तु को दूसरे के प्रोटोटाइप के रूप में बनाया जाता है, तो वह अपने माता-पिता के सभी गुणों को प्राप्त कर लेगी।
var proto = { foo: "foo", bar: () => this.foo };
var obj = Object.create(proto);
console.log(obj.foo);
console.log(obj.bar());
कंसोल आउटपुट:
> "foo"
> "foo"
नोट Object.create
ECMAScript 5 से उपलब्ध है, लेकिन यहाँ एक Object.create
है यदि आपको ECMAScript 3 के लिए समर्थन की आवश्यकता है
if (typeof Object.create !== 'function') {
Object.create = function (o) {
function F() {}
F.prototype = o;
return new F();
};
}
Object.create ()
Object.create () विधि निर्दिष्ट प्रोटोटाइप ऑब्जेक्ट और गुणों के साथ एक नई वस्तु बनाती है।
सिंटैक्स: Object.create(proto[, propertiesObject])
पैरामीटर :
- प्रोटो (वह वस्तु जो नव-निर्मित वस्तु का प्रोटोटाइप होना चाहिए।)
- propertiesObject (वैकल्पिक। यदि निर्दिष्ट और नहीं अपरिभाषित, एक वस्तु जिसका गणनीय खुद गुण (यह है कि, उन गुणों खुद पर परिभाषित किया और अपने प्रोटोटाइप श्रृंखला के साथ नहीं गणनीय गुण) संपत्ति वर्णनकर्ता निर्दिष्ट नव निर्मित वस्तु में शामिल होना, इसी के साथ संपत्ति के नाम। ये गुण Object.defineProperties () के दूसरे तर्क के अनुरूप हैं।
प्रतिलाभ की मात्रा
निर्दिष्ट प्रोटोटाइप ऑब्जेक्ट और गुणों के साथ एक नई वस्तु।
अपवाद
एक लेखन त्रुटि अपवाद अगर आद्य पैरामीटर अशक्त या किसी वस्तु नहीं है।
प्रोटोटाइपिक विरासत
मान लीजिए कि हमारे पास एक सादे वस्तु है जिसे prototype
कहा जाता है:
var prototype = { foo: 'foo', bar: function () { return this.foo; } };
अब हम एक और ऑब्जेक्ट चाहते हैं जिसे obj
कहा जाता है जो कि prototype
से विरासत में मिला है, जो यह कहते हुए है कि prototype
obj
का प्रोटोटाइप है
var obj = Object.create(prototype);
अब prototype
से सभी गुण और तरीके obj
लिए उपलब्ध होंगे
console.log(obj.foo);
console.log(obj.bar());
कंसोल आउटपुट
"foo"
"foo"
प्रोटोटाइप इनहेरिटेंस आंतरिक रूप से ऑब्जेक्ट संदर्भों के माध्यम से किया जाता है और ऑब्जेक्ट पूरी तरह से परस्पर हैं। इसका मतलब यह है कि आप जिस किसी भी प्रोटोटाइप में बदलाव करते हैं, वह हर दूसरी वस्तु को तुरंत प्रभावित करेगा जो कि प्रोटोटाइप है।
prototype.foo = "bar";
console.log(obj.foo);
कंसोल आउटपुट
"bar"
Object.prototype
प्रत्येक ऑब्जेक्ट का प्रोटोटाइप है, इसलिए इसकी दृढ़ता से अनुशंसा की जाती है कि आप इसके साथ गड़बड़ न करें, विशेष रूप से यदि आप किसी तीसरे पक्ष के पुस्तकालय का उपयोग करते हैं, लेकिन हम इसके साथ थोड़ा खेल सकते हैं।
Object.prototype.breakingLibraries = 'foo';
console.log(obj.breakingLibraries);
console.log(prototype.breakingLibraries);
कंसोल आउटपुट
"foo"
"foo"
मजेदार तथ्य मैंने इन उदाहरणों को बनाने के लिए ब्राउज़र कंसोल का उपयोग किया है और इस पृष्ठ को उस breakingLibraries
संपत्ति को जोड़कर breakingLibraries
है।
छद्म-शास्त्रीय विरासत
यह प्रोटोटाइपिक वंशानुक्रम का उपयोग करके शास्त्रीय विरासत का एक अनुकरण है जो दिखाता है कि शक्तिशाली प्रोटोटाइप कैसे हैं। यह अन्य भाषाओं से आने वाले प्रोग्रामरों के लिए भाषा को अधिक आकर्षक बनाने के लिए बनाया गया था।
महत्वपूर्ण नोट : ES6 के बाद से यह छद्म कलात्मक विरासत का उपयोग करने के लिए समझ में नहीं आता क्योंकि भाषा पारंपरिक वर्गों का अनुकरण करती है। यदि आप ES6 का उपयोग नहीं कर रहे हैं, तो आपको करना चाहिए । यदि आप अभी भी क्लासिकल इनहेरिटेंस पैटर्न का उपयोग करना चाहते हैं और आप ECMAScript 5 या निम्न वातावरण में हैं, तो छद्म-शास्त्रीय आपका सर्वश्रेष्ठ दांव है।
एक "क्लास" सिर्फ एक फ़ंक्शन है जिसे new
ऑपरेंड के साथ बुलाया जाता है और इसका उपयोग एक कंस्ट्रक्टर के रूप में किया जाता है।
function Foo(id, name) {
this.id = id;
this.name = name;
}
var foo = new Foo(1, 'foo');
console.log(foo.id);
कंसोल आउटपुट
1
foo, Foo का एक उदाहरण है। जावास्क्रिप्ट कोडिंग कन्वेंशन कहता है कि यदि कोई फ़ंक्शन कैपिटल लेटर केस से शुरू होता है तो इसे कंस्ट्रक्टर ( new
ऑपरेंड के साथ) कहा जा सकता है।
"वर्ग" के गुणों या विधियों को जोड़ने के लिए आपको उन्हें इसे प्रोटोटाइप में जोड़ना होगा, जो निर्माणकर्ता की prototype
संपत्ति में पाया जा सकता है।
Foo.prototype.bar = 'bar';
console.log(foo.bar);
कंसोल आउटपुट
बार
वास्तव में Foo एक "कंस्ट्रक्टर" के रूप में क्या कर रहा है, यह Foo.prototype
साथ ऑब्जेक्ट्स Foo.prototype
क्योंकि यह प्रोटोटाइप है।
आप हर वस्तु पर इसके निर्माता का संदर्भ पा सकते हैं
console.log(foo.constructor);
समारोह फू (आईडी, नाम) {...
console.log({ }.constructor);
फ़ंक्शन ऑब्जेक्ट () {[देशी कोड]}
और यह भी जांचें कि क्या कोई ऑब्जेक्ट किसी दिए गए वर्ग का instanceof
जो instanceof
ऑपरेटर के साथ है
console.log(foo instanceof Foo);
सच
console.log(foo instaceof Object);
सच
ऑब्जेक्ट का प्रोटोटाइप सेट करना
Object.create
+ के साथ, Object.create
फ़ंक्शन का उपयोग किसी अन्य ऑब्जेक्ट के साथ ऑब्जेक्ट बनाने के लिए किया जा सकता है क्योंकि यह प्रोटोटाइप है।
const anyObj = {
hello() {
console.log(`this.foo is ${this.foo}`);
},
};
let objWithProto = Object.create(anyObj);
objWithProto.foo = 'bar';
objWithProto.hello(); // "this.foo is bar"
किसी ऑब्जेक्ट को बिना प्रोटोटाइप के स्पष्ट रूप से बनाने के लिए, प्रोटोटाइप के रूप में null
उपयोग करें। इसका मतलब यह है कि ऑब्जेक्ट Object.prototype
से इनहेरिट नहीं करेगा और अस्तित्व की जाँच करने वाले शब्दकोशों के लिए उपयोग की जाने वाली वस्तुओं के लिए उपयोगी है, जैसे
let objInheritingObject = {};
let objInheritingNull = Object.create(null);
'toString' in objInheritingObject; // true
'toString' in objInheritingNull ; // false
ES6 से, उदाहरण के लिए, Object.setPrototypeOf
का उपयोग करके किसी मौजूदा ऑब्जेक्ट के प्रोटोटाइप को बदला जा सकता है
let obj = Object.create({foo: 'foo'});
obj = Object.setPrototypeOf(obj, {bar: 'bar'});
obj.foo; // undefined
obj.bar; // "bar"
यह लगभग कहीं भी किया जा सकता है, जिसमें this
ऑब्जेक्ट पर या एक कंस्ट्रक्टर शामिल है।
नोट: यह प्रक्रिया वर्तमान ब्राउज़रों में बहुत धीमी है और इसे संयमपूर्वक उपयोग किया जाना चाहिए, इसके बजाय इच्छित प्रोटोटाइप के साथ ऑब्जेक्ट बनाने का प्रयास करें।
ES5 से पहले, मैन्युअल रूप से परिभाषित प्रोटोटाइप के साथ ऑब्जेक्ट बनाने का एकमात्र तरीका था, उदाहरण के लिए, new
साथ इसका निर्माण करना
var proto = {fizz: 'buzz'};
function ConstructMyObj() {}
ConstructMyObj.prototype = proto;
var objWithProto = new ConstructMyObj();
objWithProto.fizz; // "buzz"
यह व्यवहार Object.create
काफी करीब है कि Object.create
लिखना संभव है।