खोज…


मानक फ़ंक्शन प्रोटोटाइप

एक 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();
    };
}

स्रोत: http://javascript.crockford.com/prototypal.html


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 है।


छद्म-शास्त्रीय विरासत

यह प्रोटोटाइपिक वंशानुक्रम का उपयोग करके शास्त्रीय विरासत का एक अनुकरण है जो दिखाता है कि शक्तिशाली प्रोटोटाइप कैसे हैं। यह अन्य भाषाओं से आने वाले प्रोग्रामरों के लिए भाषा को अधिक आकर्षक बनाने के लिए बनाया गया था।

6

महत्वपूर्ण नोट : 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);

सच

ऑब्जेक्ट का प्रोटोटाइप सेट करना

5

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
6

ES6 से, उदाहरण के लिए, Object.setPrototypeOf का उपयोग करके किसी मौजूदा ऑब्जेक्ट के प्रोटोटाइप को बदला जा सकता है

let obj = Object.create({foo: 'foo'});
obj = Object.setPrototypeOf(obj, {bar: 'bar'});

obj.foo; // undefined
obj.bar; // "bar"

यह लगभग कहीं भी किया जा सकता है, जिसमें this ऑब्जेक्ट पर या एक कंस्ट्रक्टर शामिल है।

नोट: यह प्रक्रिया वर्तमान ब्राउज़रों में बहुत धीमी है और इसे संयमपूर्वक उपयोग किया जाना चाहिए, इसके बजाय इच्छित प्रोटोटाइप के साथ ऑब्जेक्ट बनाने का प्रयास करें।

5

ES5 से पहले, मैन्युअल रूप से परिभाषित प्रोटोटाइप के साथ ऑब्जेक्ट बनाने का एकमात्र तरीका था, उदाहरण के लिए, new साथ इसका निर्माण करना

var proto = {fizz: 'buzz'};

function ConstructMyObj() {}
ConstructMyObj.prototype = proto;

var objWithProto = new ConstructMyObj();
objWithProto.fizz; // "buzz"

यह व्यवहार Object.create काफी करीब है कि Object.create लिखना संभव है।



Modified text is an extract of the original Stack Overflow Documentation
के तहत लाइसेंस प्राप्त है CC BY-SA 3.0
से संबद्ध नहीं है Stack Overflow