Object.create () और नए SomeFunction () के बीच अंतर को समझना


391

मैं हाल ही Object.create()में जावास्क्रिप्ट में विधि पर ठोकर खाई है , और यह कैसे एक वस्तु का एक नया उदाहरण बनाने से अलग है यह कटौती करने की कोशिश कर रहा हूँnew SomeFunction() , और जब आप एक से अधिक का उपयोग करना चाहेंगे।

निम्नलिखित उदाहरण पर विचार करें:

var test = {
  val: 1,
  func: function() {
    return this.val;
  }
};
var testA = Object.create(test);

testA.val = 2;
console.log(test.func()); // 1
console.log(testA.func()); // 2

console.log('other test');
var otherTest = function() {
  this.val = 1;
  this.func = function() {
    return this.val;
  };
};

var otherTestA = new otherTest();
var otherTestB = new otherTest();
otherTestB.val = 2;
console.log(otherTestA.val); // 1 
console.log(otherTestB.val); // 2

console.log(otherTestA.func()); // 1
console.log(otherTestB.func()); // 2

ध्यान दें कि दोनों मामलों में समान व्यवहार देखा जाता है। ऐसा लगता है कि इन दो परिदृश्यों के बीच प्राथमिक अंतर हैं:

  • Object.create()वास्तव में उपयोग की जाने वाली वस्तु, नई वस्तु का प्रोटोटाइप बनाती है, जबकि मेंnew Function() घोषित गुणों / कार्यों से प्रोटोटाइप नहीं ।
  • आप Object.create()सिंटैक्स के साथ क्लोजर नहीं बना सकते हैं जैसा कि आप कार्यात्मक सिंटैक्स के साथ करेंगे। यह जावास्क्रिप्ट के लेक्सिकल (बनाम ब्लॉक) प्रकार के दायरे को देखते हुए तर्कसंगत है।

क्या उपरोक्त कथन सही हैं? और क्या मुझे कुछ याद आ रहा है? आप एक दूसरे का उपयोग कब करेंगे?

EDIT: उपरोक्त कोड नमूने के jsfiddle संस्करण का लिंक: http://jsfiddle.net/rZfYL/


जवाबों:


247

Object.create में उपयोग की जाने वाली वस्तु वास्तव में नई वस्तु का प्रोटोटाइप बनाती है, जहाँ नए फ़ंक्शन में () घोषित गुण / फ़ंक्शंस को प्रोटोटाइप नहीं बनाते हैं।

हां, Object.createएक ऐसी वस्तु का निर्माण करता है , जो सीधे उसके पहले तर्क के रूप में प्राप्त हुई है।

कंस्ट्रक्टर कार्यों के साथ, नई बनाई गई वस्तु कंस्ट्रक्टर के प्रोटोटाइप से विरासत में मिली, जैसे:

var o = new SomeConstructor();

उपरोक्त उदाहरण में, oसीधे से विरासत में मिला है SomeConstructor.prototype

यहां एक अंतर है, Object.createआप एक ऐसी वस्तु बना सकते हैं जो किसी भी चीज़ से विरासत में नहीं मिलती है, Object.create(null);दूसरी ओर, यदि आप सेट SomeConstructor.prototype = null;करते हैं तो नई बनाई गई वस्तु से विरासत में मिलेगा Object.prototype

जैसा कि आप कार्यात्मक वाक्यविन्यास के साथ करेंगे आप Object.create सिंटैक्स के साथ क्लोजर नहीं बना सकते हैं। यह जावास्क्रिप्ट के लेक्सिकल (बनाम ब्लॉक) प्रकार के दायरे को देखते हुए तर्कसंगत है।

ठीक है, आप क्लोजर बना सकते हैं, जैसे प्रॉपर्टी डिस्क्रिप्टर तर्क का उपयोग करते हुए:

var o = Object.create({inherited: 1}, {
  foo: {
    get: (function () { // a closure
      var closured = 'foo';
      return function () {
        return closured+'bar';
      };
    })()
  }
});

o.foo; // "foobar"

ध्यान दें कि मैं ECMAScript 5 वीं संस्करण Object.createविधि के बारे में बात कर रहा हूं , न कि क्रॉकफोर्ड की शिम।

विधि नवीनतम ब्राउज़रों पर मूल रूप से कार्यान्वित होने लगी है, इस संगतता तालिका की जांच करें ।


2
@ सीएमएस 2 प्रश्न। 1) क्या Object.create (नल) पर गुंजाइश श्रृंखला अभी भी वैश्विक दायरे (जैसे कि ब्राउज़र में 'विंडो') पर समाप्त होती है, या क्या यह स्वयं पर समाप्त होती है? 2) यह अभी भी मेरे लिए स्पष्ट नहीं है कि Object.create क्यों पेश किया गया था (जैसे कि क्या विशेषता याद आ रही थी कि यह संबोधित किया गया था;) और क्यों कोई इसका उपयोग नए फ़ंक्शन () के बजाय करेगा;
मैट

9
@ मैट, 1) स्कोप चेन वास्तव में यहां से संबंधित अवधारणा नहीं है, स्कोप चेन आइडेंटिफ़ायर रिज़ॉल्यूशन से संबंधित है , उदाहरण के लिए: foo;वर्तमान लेक्सिकल वातावरण में कैसे हल किया जाता है । 2) विरासत को लागू करने का एक आसान तरीका प्रदान करने के लिए, यह वास्तव में शक्तिशाली निर्माण है। IMO मैं इसका उपयोग करूंगा क्योंकि यह वास्तव में सरल और हल्का है, लेकिन उत्पादन कोड के लिए, हमें अभी भी कुछ समय इंतजार करना होगा जब तक कि ES5 व्यापक रूप से समर्थित नहीं है। अनुपलब्ध सुविधाओं के बारे में, एक "प्राचीन" वस्तु बनाने का तथ्य Object.create(null);गायब था, यह वास्तव में विश्वसनीय हैश-टेबल जैसी वस्तुओं को लागू करने के लिए उपयोगी है ...
CMS

@ सीएमएस धन्यवाद। तो बस जब आप 'Object.create' का उपयोग करके एक ऑब्जेक्ट बनाते हैं, तो आपको उस ऑब्जेक्ट का चयन करने की क्षमता मिलती है जो इसका प्रोटोटाइप होना चाहिए।
अंशुल

@ सीएमएस ठीक है, तो Object.create(null)इसका मतलब है कि hasOwnProperty()जब आप इसे कोई भी विरासत में मिलाते हैं, तो आपको बकवास का उपयोग नहीं करना पड़ता है ??? मुझे वह पसंद है - धन्यवाद। बेशक, हर कोई अभी भी करने जा रहा है hasOwnPropertyक्योंकि हर कोई उपयोग नहीं करेगा Object.create(null)इसलिए मुझे यकीन नहीं है कि यह एक वास्तविक लाभ है ... अब तक मैंने Object.create()पूरी तरह से असंबद्धता के अन्य "लाभ" पाए हैं ।
user949300

424

बहुत बस ने कहा, new Xहै Object.create(X.prototype)इसके साथ ही चल रहा है के साथ constructorकार्य करते हैं। (और वास्तविक वस्तु constructorको मौका दिया returnजाना चाहिए जो इसके बजाय अभिव्यक्ति का परिणाम होना चाहिए this।)

बस। :)

बाकी के उत्तर सिर्फ भ्रमित करने वाले हैं, क्योंकि स्पष्ट रूप से किसी और की परिभाषा नहीं पढ़ता है new। ;)


23
+1 सादगी और स्पष्टता! (हालांकि Object.create (अशक्त) एक अच्छा विकल्प लगता है - शायद इसका उल्लेख करना चाहिए)।
user949300

यह आसान है कि जाने के लिए रास्ता है
बिल

यह सिर्फ "प्रतीक्षा करें, इसलिए फ़ंक्शन के प्रोटोटाइप भी हैं , का प्रश्न छोड़ देता है ? उन और वस्तु प्रोटोटाइप के बीच क्या संबंध है ?"
क्वर्टी

3
@ क्वर्टी: जेएस में, सब कुछ एक वस्तु है। :) उन्होंने जावा से कॉपी किया, जिन्होंने इसे स्मॉलटॉक से कॉपी किया, जो इसके साथ अंत तक सभी तरह से चले गए। यह "उद्भव" का एक अच्छा मामला है, जिससे सामान्य रूप से जीवन आसान हो जाता है।
Evi1M4chine

@ Evi1M4chine वास्तव में जावा में, फ़ंक्शन ऑब्जेक्ट नहीं हैं (और न ही आदिम हैं, इस मामले के लिए) ... और ऑब्जेक्ट में प्रोटोटाइप नहीं हैं, इसलिए तुलना अन-फिटिंग लगती है। तथ्य यह है कि जेएस अन्य लोकप्रिय ओओ भाषाओं की तुलना में अलग तरह से काम करता है भ्रम का एक प्रमुख स्रोत है (और यह मदद नहीं करता है कि ब्राउज़र कार्यों और प्रोटोटाइप सहित वस्तुओं के नेटवर्क की कल्पना करने का एक आसान तरीका प्रदान नहीं करते हैं)। PS मुझे यह लिंक मददगार लगा: davidwalsh.name/javascript-objects-deconstruction
Qwertie

204

यहां दोनों कॉल के लिए आंतरिक रूप से होने वाले चरण हैं:
(संकेत: केवल अंतर चरण 3 में है)


new Test():

  1. new Object()obj बनाएँ
  2. सेट obj.__proto__करने के लिएTest.prototype
  3. return Test.call(obj) || obj; // normally obj is returned but constructors in JS can return a value

Object.create( Test.prototype )

  1. new Object()obj बनाएँ
  2. सेट obj.__proto__करने के लिएTest.prototype
  3. return obj;

इसलिए मूल रूप Object.createसे कंस्ट्रक्टर को निष्पादित नहीं करता है।


@Ray तो ऑब्जेक्ट का उपयोग कर रहे हैं। हमारे पास फंक्शन के गुण हैं जो कंस्ट्रक्टर फ़ंक्शन में उल्लिखित हैं?

जब तक प्रॉपर्टी निजी हैं और प्रोटोटाइप पर निर्दिष्ट नहीं हैं, हां, उन्हें विरासत में नहीं मिलेगा और आपके पास उन्हें नई वस्तु में नहीं रखा जाएगा (और, मैं जोड़ूंगा, आप अंततः प्रोटोटाइप किए गए गुणों को प्राप्त करने की उम्मीद कर सकते हैं माता-पिता से, बस जब मूल निर्माता कम से कम एक बार निष्पादित किया गया हो)।
कामाफेदर

अधिकांश कंस्ट्रक्टर कार्यों के साथ-साथ तरीकों को निर्धारित ऑब्जेक्ट के भीतर परिभाषित किया जाता है, newमूल रूप से सभी कार्यों को डुप्लिकेट किया जाता है, जबकि Object.createऐसा नहीं होता है।
स्पार्क

61

मुझे समझाने की कोशिश करें ( ब्लॉग पर अधिक ):

  1. जब आप Carकंस्ट्रक्टर लिखते हैं var Car = function(){}, तो यह है कि चीजें आंतरिक रूप से कैसे होती हैं: जावास्क्रिप्ट ऑब्जेक्ट्स बनाते समय प्रोटोटाइप चेन का आरेख हमारे पास एक {prototype}छिपा हुआ लिंक है Function.prototypeजो सुलभ नहीं है और एक prototypeलिंक Car.prototypeजिसके लिए सुलभ है और जिसमें वास्तविक constructorहै Car। Function.prototype और Car.prototype दोनों में लिंक छिपे हुए हैं Object.prototype
  2. जब हम newऑपरेटर और createविधि का उपयोग करके दो समतुल्य वस्तुएं बनाना चाहते हैं तो हमें इसे इस तरह करना होगा: Honda = new Car();और Maruti = Object.create(Car.prototype)ऑब्जेक्ट निर्माण विधियों को अलग करने के लिए प्रोटोटाइप चेन का आरेख क्या हो रहा है?

    Honda = new Car();- जब आप इस तरह की कोई वस्तु बनाते हैं तो छिपी हुई {prototype}संपत्ति को इंगित किया जाता है Car.prototype। इसलिए यहाँ, {prototype}होंडा ऑब्जेक्ट हमेशा रहेगा Car.prototype- हमारे पास {prototype}ऑब्जेक्ट की संपत्ति को बदलने का कोई विकल्प नहीं है । क्या होगा यदि मैं हमारी नई बनाई गई वस्तु के प्रोटोटाइप को बदलना चाहता हूं?
    Maruti = Object.create(Car.prototype)- जब आप इस तरह एक ऑब्जेक्ट बनाते हैं तो आपके पास अपनी ऑब्जेक्ट की {prototype}संपत्ति चुनने के लिए एक अतिरिक्त विकल्प होता है । यदि आप Car.prototype चाहते हैं, {prototype}तो इसे फ़ंक्शन में पैरामीटर के रूप में पास करें। आप किसी भी नहीं करना चाहते हैं {prototype}अपनी वस्तु के लिए तो आप पास कर सकते हैं nullइस तरह: Maruti = Object.create(null)

निष्कर्ष - विधि का उपयोग करके Object.createआपको अपनी वस्तु {prototype}संपत्ति चुनने की स्वतंत्रता है । में new Car();, आपको लगता है कि स्वतंत्रता नहीं है।

OO JavaScript में पसंदीदा तरीका:

मान लीजिए कि हमें दो वस्तुओं है aऔर b

var a = new Object();
var b = new Object();

अब, मान लीजिए aकि कुछ विधियाँ हैं, जो bएक्सेस करना चाहती हैं। उसके लिए, हमें ऑब्जेक्ट इनहेरिटेंस की आवश्यकता होती है ( यदि हम उन तरीकों तक पहुंच चाहते हैं तो केवल aइसका प्रोटोटाइप होना चाहिए b)। यदि हम के प्रोटोटाइप की जांच करते हैं aऔर bतब हमें पता चलेगा कि वे प्रोटोटाइप को साझा करते हैं Object.prototype

Object.prototype.isPrototypeOf(b); //true
a.isPrototypeOf(b); //false (the problem comes into the picture here).

समस्या - हम ऑब्जेक्ट aको प्रोटोटाइप के रूप में चाहते हैं b, लेकिन यहां हमने bप्रोटोटाइप के साथ ऑब्जेक्ट बनाया Object.prototypeसमाधान - ECMAScript 5 की शुरुआत की गई Object.create(), ताकि इस तरह की विरासत को आसानी से प्राप्त किया जा सके। यदि हम bइस तरह से वस्तु बनाते हैं :

var b = Object.create(a);

फिर,

a.isPrototypeOf(b);// true (problem solved, you included object a in the prototype chain of object b.)

इसलिए, यदि आप ऑब्जेक्ट ओरिएंटेड स्क्रिप्टिंग कर रहे हैं तो Object.create()इनहेरिटेंस के लिए बहुत उपयोगी है।


तो, यह कुछ हद तक निर्माता के बिना वस्तु निर्माण के समान है? हम वर्ग के सभी लाभों का आनंद लेंगे। ओब्ज इन्स्टॉफ क्लास भी सही होगी। लेकिन हम क्लास फंक्शन को नए के माध्यम से लागू नहीं कर रहे हैं।
प्रवीण

@ अंशुल आपने कहा था कि जो सही a.isPrototypeOf(b);होगा falseवही लौटेगा , क्योंकि दोनों वस्तुएं अलग-अलग हैं और अलग-अलग मेमोरी की ओर इशारा करती हैं। newऑपरेटर के साथ ऐसा करने का सही तरीका यहां है। - jsfiddle.net/167onunp
सागर कारीरा

आप ऐसा करने के बजाय सिर्फ b की प्रोटोटाइप प्रॉपर्टी को सेट क्यों नहीं करेंगे?
19

आपके ब्लॉग पर भी लेख पसंद आया। मुझे अवधारणा को बेहतर ढंग से समझने में मदद मिली। धन्यवाद।
स्थिर_दादी

1
निष्कर्ष यह सब कहता है।
कुशाल्वम

44

इस:

var foo = new Foo();

तथा

var foo = Object.create(Foo.prototype);

काफी समान हैं। एक महत्वपूर्ण अंतर यह है कि new Fooवास्तव में कंस्ट्रक्टर कोड चलता है, जबकि Object.createकोड को निष्पादित नहीं करेगा

function Foo() {
    alert("This constructor does not run with Object.create");
}

ध्यान दें कि यदि आप दो-पैरामीटर संस्करण का उपयोग करते हैं Object.create()तो आप बहुत अधिक शक्तिशाली चीजें कर सकते हैं।


1
महान व्याख्या। हो सकता है कि मैं Object.createइसका सबसे सरल रूप में उपयोग करूं, जो आपको प्रोटोटाइप इनहेरिटेंस का लाभ उठाते हुए अपने कोड से कंस्ट्रक्टर के कार्यों को छोड़ने की अनुमति देता है।
रिकी बॉयस

23

अंतर तथाकथित "छद्मकोशिकीय बनाम प्रोटोटाइप विरासत" है। सुझाव यह है कि अपने कोड में केवल एक ही प्रकार का उपयोग करें, दोनों को मिलाकर नहीं।

छद्मकोशिकीय विरासत ("नए" ऑपरेटर के साथ) में, कल्पना करें कि आप पहले छद्म वर्ग को परिभाषित करते हैं, और फिर उस वर्ग से वस्तुओं का निर्माण करते हैं। उदाहरण के लिए, एक छद्म वर्ग "व्यक्ति" को परिभाषित करें, और फिर "व्यक्ति" से "ऐलिस" और "बॉब" बनाएं।

प्रोटोटाइप इनहेरिटेंस (Object.create का उपयोग करके), आप सीधे एक विशिष्ट व्यक्ति "ऐलिस" बनाते हैं, और फिर प्रोटोटाइप के रूप में "ऐलिस" का उपयोग करके एक अन्य व्यक्ति "बॉब" बनाते हैं। यहां कोई "वर्ग" नहीं है; सभी वस्तुएं हैं।

आंतरिक रूप से, जावास्क्रिप्ट "प्रोटोटाइप विरासत" का उपयोग करता है; "स्यूडोक्लासिकल" तरीका कुछ चीनी है।

इस लिंक को दो तरीकों की तुलना के लिए देखें ।


21
function Test(){
    this.prop1 = 'prop1';
    this.prop2 = 'prop2';
    this.func1 = function(){
        return this.prop1 + this.prop2;
    }
};

Test.prototype.protoProp1 = 'protoProp1';
Test.prototype.protoProp2 = 'protoProp2';
var newKeywordTest = new Test();
var objectCreateTest = Object.create(Test.prototype);

/* Object.create   */
console.log(objectCreateTest.prop1); // undefined
console.log(objectCreateTest.protoProp1); // protoProp1 
console.log(objectCreateTest.__proto__.protoProp1); // protoProp1

/* new    */
console.log(newKeywordTest.prop1); // prop1
console.log(newKeywordTest.__proto__.protoProp1); // protoProp1

सारांश:

1) newकीवर्ड के साथ नोट करने के लिए दो चीजें हैं;

a) फ़ंक्शन का उपयोग एक कंस्ट्रक्टर के रूप में किया जाता है

b) function.prototypeऑब्जेक्ट को __proto__संपत्ति में पास किया जाता है ... या जहां __proto__समर्थित नहीं है, यह दूसरी जगह है जहां नई वस्तु गुणों को ढूंढती है

2) Object.create(obj.prototype)आप के साथ एक वस्तु का निर्माण कर रहे हैं ( obj.prototype) और इच्छित वस्तु के लिए इसे पारित कर रहे हैं .. इस अंतर के साथ कि अब नई वस्तु __proto__भी obj.prototyp को इंगित कर रहा है (कृपया उसके लिए xj9 द्वारा ans रेफरी)


15

ऑब्जेक्ट निर्माण वेरिएंट।


वेरिएंट 1 : ' न्यू ऑब्जेक्ट () ' -> ऑब्जेक्ट कंस्ट्रक्टर बिना तर्क के।

var p1 = new Object(); // 'new Object()' create and return empty object -> {}

var p2 = new Object(); // 'new Object()' create and return empty object -> {}

console.log(p1); // empty object -> {}

console.log(p2); // empty object -> {}

// p1 and p2 are pointers to different objects
console.log(p1 === p2); // false

console.log(p1.prototype); // undefined

// empty object which is in fact Object.prototype
console.log(p1.__proto__); // {}

// empty object to which p1.__proto__ points
console.log(Object.prototype); // {}

console.log(p1.__proto__ === Object.prototype); // true

// null, which is in fact Object.prototype.__proto__
console.log(p1.__proto__.__proto__); // null

console.log(Object.prototype.__proto__); // null

यहां छवि विवरण दर्ज करें


वेरिएंट 2 : ' न्यू ऑब्जेक्ट (व्यक्ति) ' -> तर्क के साथ ऑब्जेक्ट कंस्ट्रक्टर।

const person = {
    name: 'no name',
    lastName: 'no lastName',
    age: -1
}

// 'new Object(person)' return 'person', which is pointer to the object ->
//  -> { name: 'no name', lastName: 'no lastName', age: -1 }
var p1 = new Object(person);

// 'new Object(person)' return 'person', which is pointer to the object ->
//  -> { name: 'no name', lastName: 'no lastName', age: -1 }
var p2 = new Object(person);

// person, p1 and p2 are pointers to the same object
console.log(p1 === p2); // true
console.log(p1 === person); // true
console.log(p2 === person); // true

p1.name = 'John'; // change 'name' by 'p1'
p2.lastName = 'Doe'; // change 'lastName' by 'p2'
person.age = 25; // change 'age' by 'person'

// when print 'p1', 'p2' and 'person', it's the same result,
// because the object they points is the same
console.log(p1); // { name: 'John', lastName: 'Doe', age: 25 }
console.log(p2); // { name: 'John', lastName: 'Doe', age: 25 }
console.log(person); // { name: 'John', lastName: 'Doe', age: 25 }

यहां छवि विवरण दर्ज करें


वेरिएंट 3.1 : ' Object.create (व्यक्ति) '। साधारण वस्तु 'व्यक्ति' के साथ Object.create का उपयोग करें। 'Object.create (व्यक्ति)' नई खाली ऑब्जेक्ट बनाएगा (और लौटाएगा) उसी नए खाली ऑब्जेक्ट में '__proto__' गुण जोड़ें। यह गुण '__proto__' ऑब्जेक्ट 'व्यक्ति' को इंगित करेगा।

const person = {
        name: 'no name',
        lastName: 'no lastName',
        age: -1,
        getInfo: function getName() {
           return `${this.name} ${this.lastName}, ${this.age}!`;
    }
}

var p1 = Object.create(person);

var p2 = Object.create(person);

// 'p1.__proto__' and 'p2.__proto__' points to
// the same object -> 'person'
// { name: 'no name', lastName: 'no lastName', age: -1, getInfo: [Function: getName] }
console.log(p1.__proto__);
console.log(p2.__proto__);
console.log(p1.__proto__ === p2.__proto__); // true

console.log(person.__proto__); // {}(which is the Object.prototype)

// 'person', 'p1' and 'p2' are different
console.log(p1 === person); // false
console.log(p1 === p2); // false
console.log(p2 === person); // false

// { name: 'no name', lastName: 'no lastName', age: -1, getInfo: [Function: getName] }
console.log(person);

console.log(p1); // empty object - {}

console.log(p2); // empty object - {}

// add properties to object 'p1'
// (properties with the same names like in object 'person')
p1.name = 'John';
p1.lastName = 'Doe';
p1.age = 25;

// add properties to object 'p2'
// (properties with the same names like in object 'person')
p2.name = 'Tom';
p2.lastName = 'Harrison';
p2.age = 38;

// { name: 'no name', lastName: 'no lastName', age: -1, getInfo: [Function: getName] }
console.log(person);

// { name: 'John', lastName: 'Doe', age: 25 }
console.log(p1);

// { name: 'Tom', lastName: 'Harrison', age: 38 }
console.log(p2);

// use by '__proto__'(link from 'p1' to 'person'),
// person's function 'getInfo'
console.log(p1.getInfo()); // John Doe, 25!

// use by '__proto__'(link from 'p2' to 'person'),
// person's function 'getInfo'
console.log(p2.getInfo()); // Tom Harrison, 38!

यहां छवि विवरण दर्ज करें


वेरिएंट 3.2 : ' Object.create (Object.prototype) '। अंतर्निहित ऑब्जेक्ट के साथ Object.create का उपयोग करें -> 'Object.prototype'। 'Object.create (Object.prototype)' नई खाली ऑब्जेक्ट बनाएगा (और लौटाएगा) उसी नए खाली ऑब्जेक्ट में '__proto__' गुण जोड़ें। यह गुण '__proto__' ऑब्जेक्ट 'Object.prototype' को इंगित करेगा।

// 'Object.create(Object.prototype)' :
// 1. create and return empty object -> {}.
// 2. add to 'p1' property '__proto__', which is link to 'Object.prototype'
var p1 = Object.create(Object.prototype);

// 'Object.create(Object.prototype)' :
// 1. create and return empty object -> {}.
// 2. add to 'p2' property '__proto__', which is link to 'Object.prototype'
var p2 = Object.create(Object.prototype);

console.log(p1); // {}

console.log(p2); // {}

console.log(p1 === p2); // false

console.log(p1.prototype); // undefined

console.log(p2.prototype); // undefined

console.log(p1.__proto__ === Object.prototype); // true

console.log(p2.__proto__ === Object.prototype); // true

यहां छवि विवरण दर्ज करें


वेरिएंट 4 : ' न्यू समफिक्शन () '

// 'this' in constructor-function 'Person'
// represents a new instace,
// that will be created by 'new Person(...)'
// and returned implicitly
function Person(name, lastName, age) {

    this.name = name;
    this.lastName = lastName;
    this.age = age;

    //-----------------------------------------------------------------
    // !--- only for demonstration ---
    // if add function 'getInfo' into
    // constructor-function 'Person',
    // then all instances will have a copy of the function 'getInfo'!
    //
    // this.getInfo: function getInfo() {
    //  return this.name + " " + this.lastName + ", " + this.age + "!";
    // }
    //-----------------------------------------------------------------
}

// 'Person.prototype' is an empty object
// (before add function 'getInfo')
console.log(Person.prototype); // Person {}

// With 'getInfo' added to 'Person.prototype',
// instances by their properties '__proto__',
// will have access to the function 'getInfo'.
// With this approach, instances not need
// a copy of the function 'getInfo' for every instance.
Person.prototype.getInfo = function getInfo() {
    return this.name + " " + this.lastName + ", " + this.age + "!";
}

// after function 'getInfo' is added to 'Person.prototype'
console.log(Person.prototype); // Person { getInfo: [Function: getInfo] }

// create instance 'p1'
var p1 = new Person('John', 'Doe', 25);

// create instance 'p2'
var p2 = new Person('Tom', 'Harrison', 38);

// Person { name: 'John', lastName: 'Doe', age: 25 }
console.log(p1);

// Person { name: 'Tom', lastName: 'Harrison', age: 38 }
console.log(p2);

// 'p1.__proto__' points to 'Person.prototype'
console.log(p1.__proto__); // Person { getInfo: [Function: getInfo] }

// 'p2.__proto__' points to 'Person.prototype'
console.log(p2.__proto__); // Person { getInfo: [Function: getInfo] }

console.log(p1.__proto__ === p2.__proto__); // true

// 'p1' and 'p2' points to different objects(instaces of 'Person')
console.log(p1 === p2); // false

// 'p1' by its property '__proto__' reaches 'Person.prototype.getInfo' 
// and use 'getInfo' with 'p1'-instance's data
console.log(p1.getInfo()); // John Doe, 25!

// 'p2' by its property '__proto__' reaches 'Person.prototype.getInfo' 
// and use 'getInfo' with 'p2'-instance's data
console.log(p2.getInfo()); // Tom Harrison, 38!

यहां छवि विवरण दर्ज करें


अच्छा सारांश। धन्यवाद। इसने आज मेरी मदद की !!
आनंदराजा_श्रीनिवासन

11

आंतरिक रूप Object.createसे यह करता है:

Object.create = function (o) {
    function F() {}
    F.prototype = o;
    return new F();
};

सिंटैक्स सिर्फ इस भ्रम को दूर करता है कि जावास्क्रिप्ट क्लासिकल इनहेरिटेंस का उपयोग करता है।


25
ECMAScript 5 Object.createविधि, इससे बहुत अधिक है, आप संपत्ति के विवरणकर्ताओं द्वारा गुणों को परिभाषित कर सकते हैं और आप एक ऐसी वस्तु बना सकते हैं जो किसी भी चीज़ से विरासत में नहीं मिलती है ( Object.create(null);), इस प्रकार के शिम से बचना चाहिए क्योंकि आप वास्तव में अनुकरण नहीं कर सकते हैं ES3 पर व्यवहार। अधिक जानकारी
CMS

@CMS से सहमत हैं, लेकिन सामान्य तौर पर, यह सरल पॉलीफ़िल है Object.create
वी। कोवपैक

10

इस जवाब के अनुसार और इस वीडियो के लिए new कीवर्ड अगली चीजें करता है:

  1. नई वस्तु बनाता है।

  2. निर्माण कार्य के लिए नई वस्तु लिंक (prototype ) के ।

  3. बनाता है thisनई वस्तु के लिए चर बिंदु ।

  4. नई वस्तु और अंतर्निहित प्रदर्शन का उपयोग करके निर्माता कार्य निष्पादित करता है return this ;

  5. नई ऑब्जेक्ट की प्रॉपर्टी को कंस्ट्रक्टर फ़ंक्शन नाम असाइन करता है constructor

Object.createकेवल 1stऔर 2ndकदम करता है !!!

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.