जावास्क्रिप्ट ऑब्जेक्ट के प्रोटोटाइप को कैसे सेट किया जाए जो पहले से ही तत्काल हो?


106

मान लीजिए कि fooमेरे जावास्क्रिप्ट कोड में एक ऑब्जेक्ट है। fooएक जटिल वस्तु है और यह कहीं और उत्पन्न होती है। मैं fooऑब्जेक्ट के प्रोटोटाइप को कैसे बदल सकता हूं ?

मेरी प्रेरणा .NET से जावास्क्रिप्ट शाब्दिक रूप से क्रमबद्ध वस्तुओं के लिए उपयुक्त प्रोटोटाइप सेट कर रही है।

मान लीजिए कि मैंने ASP.NET पृष्ठ के भीतर निम्नलिखित जावास्क्रिप्ट कोड लिखा है।

var foo = <%=MyData %>;

मान लीजिए कि एक वस्तु पर MyData.NET JavaScriptSerializerको लागू करने का परिणाम है Dictionary<string,string>

रन-टाइम पर, यह निम्नलिखित हो जाता है:

var foo = [{"A":"1","B":"2"},{"X":"7","Y":"8"}];

जैसा कि आप देख सकते हैं, fooवस्तुओं की एक सरणी बन जाता है। मैं fooएक उपयुक्त प्रोटोटाइप के साथ आरंभ करने में सक्षम होना चाहूंगा । मैं नहीं संशोधित करना चाहते हैं Object.prototypeऔर न ही Array.prototype। मैं यह कैसे कर सकता हूँ?


क्या आप इसके मौजूदा प्रोटोटाइप में जोड़ना चाहते हैं या इसे एक नए प्रोटोटाइप में बदलना चाहते हैं?
SLKs

क्या आपका मतलब है कि प्रोटोटाइप में बदलाव करना - या वास्तव में प्रोटोटाइप को बदलना जैसे कि एक प्रोटोटाइप को स्विच करना और इसे दूसरे के साथ बदलना। मुझे यकीन नहीं है कि बाद में मामला संभव है।
जेम्स गंट

2
क्या आपका मतलब स्पष्ट प्रोटोटाइप संपत्ति या निहित प्रोटोटाइप लिंक से है? (वे दोनों दो अलग-अलग चीजें हैं)
asइम विडास

मैं मूल रूप से इससे चिंतित था: stackoverflow.com/questions/7013545/…
विवियन रिवर

1
क्या आप बैकबोन extendया गूगल के परिचित हैं goog.inherit? कई डेवलपर्स बुजुर्ग newकंस्ट्रक्टर को कॉल करने से पहले विरासत बनाने के तरीके प्रदान करते हैं - जो कि हमें दिए जाने से पहले है Object.createऔर ओवरराइडिंग के बारे में चिंता करने की आवश्यकता नहीं है Object.prototype
रयान

जवाबों:


114

EDIT फरवरी 2012: नीचे दिया गया उत्तर अब सटीक नहीं है। __proto__ को "मानक वैकल्पिक" के रूप में ECMAScript 6 में जोड़ा जा रहा है, जिसका अर्थ है कि इसे लागू करने की आवश्यकता नहीं है, लेकिन यदि यह है, तो इसे नियमों के दिए गए सेट का पालन करना चाहिए। यह वर्तमान में अनसुलझा है लेकिन कम से कम यह आधिकारिक तौर पर जावास्क्रिप्ट के विनिर्देश का हिस्सा होगा।

यह सवाल सतह पर लगता है की तुलना में बहुत अधिक जटिल है, और सबसे अधिक लोगों के वेतन ग्रेड से परे जावस के आंतरिक के ज्ञान के संबंध में है।

prototypeकिसी वस्तु की संपत्ति का उपयोग उस वस्तु की नई बाल वस्तुओं को बनाते समय किया जाता है। इसे बदलना वस्तु में स्वयं को प्रतिबिंबित नहीं करता है, बल्कि प्रतिबिंबित होता है जब उस वस्तु का उपयोग अन्य वस्तुओं के लिए एक निर्माता के रूप में किया जाता है, और किसी मौजूदा वस्तु के प्रोटोटाइप को बदलने में इसका कोई उपयोग नहीं होता है।

function myFactory(){};
myFactory.prototype = someOtherObject;

var newChild = new myFactory;
newChild.__proto__ === myFactory.prototype === someOtherObject; //true

वस्तुओं में एक आंतरिक [[प्रोटोटाइप]] संपत्ति होती है जो वर्तमान प्रोटोटाइप की ओर इशारा करती है। जिस तरह से यह काम करता है जब भी किसी वस्तु पर एक संपत्ति कहा जाता है तो यह ऑब्जेक्ट पर शुरू होगा और फिर रूट ऑब्जेक्ट प्रोटोटाइप के बाद [[प्रोटोटाइप]] श्रृंखला के माध्यम से मेल खाता है, या असफल होने तक ऊपर जाएगा। इस तरह से जावास्क्रिप्ट रनटाइम बिल्डिंग और ऑब्जेक्ट्स के संशोधन के लिए अनुमति देता है; इसकी एक योजना है जिसे इसकी आवश्यकता है।

__proto__संपत्ति (अब एक बहुत) कुछ कार्यान्वयन में मौजूद है: किसी भी मोज़िला कार्यान्वयन, सभी वेबकिट लोगों मैं के बारे में पता है, कुछ अन्य शामिल हैं। यह संपत्ति आंतरिक [[प्रोटोटाइप]] संपत्ति की ओर इशारा करती है और वस्तुओं पर संशोधन के बाद निर्माण की अनुमति देती है। कोई भी गुण और फ़ंक्शन इस जंजीर लुक के कारण प्रोटोटाइप से मेल खाने के लिए तुरंत स्विच हो जाएंगे।

यह सुविधा, जबकि अब मानकीकृत की जा रही है, अभी भी जावास्क्रिप्ट का एक आवश्यक हिस्सा नहीं है, और इसका समर्थन करने वाली भाषाओं में आपके कोड को "अडॉप्टिमाइज्ड" श्रेणी में नीचे दस्तक देने की उच्च संभावना है। जेएस इंजनों को कोड को वर्गीकृत करने के लिए अपना सर्वश्रेष्ठ करना पड़ता है, विशेष रूप से "हॉट" कोड जो बहुत बार एक्सेस किया जाता है, और यदि आप कुछ फैंसी जैसे संशोधन कर रहे हैं __proto__, तो वे आपके कोड को बिल्कुल भी ऑप्टिमाइज़ नहीं करेंगे।

यह पोस्ट https://bugzilla.mozilla.org/show_bug.cgi?id=607863 विशेष रूप से वर्तमान कार्यान्वयन __proto__और उनके बीच के अंतरों पर चर्चा करती है। हर कार्यान्वयन इसे अलग तरीके से करता है, क्योंकि यह एक कठिन और अनसुलझी समस्या है। जावास्क्रिप्ट में सब कुछ परस्पर भिन्न है, सिवाय एक।) सिंटैक्स b।) होस्ट ऑब्जेक्ट (तकनीकी रूप से जावास्क्रिप्ट के बाहर डोम मौजूद है) और सी।) __proto__। बाकी पूरी तरह से आप और हर दूसरे डेवलपर के हाथों में है, इसलिए आप देख सकते हैं कि क्यों __proto__एक गले में अंगूठे की तरह चिपक जाती है।

एक चीज है __proto__जो इसके लिए अनुमति देती है अन्यथा करना असंभव है: रनवे पर एक ऑब्जेक्ट प्रोटोटाइप का पदनाम इसके निर्माता से अलग होता है। यह एक महत्वपूर्ण उपयोग मामला है और प्राथमिक कारणों __proto__में से एक पहले से ही मृत नहीं है। यह पर्याप्त महत्वपूर्ण है कि यह सद्भाव के निर्माण में एक गंभीर चर्चा बिंदु है, या जल्द ही ECMAScript 6 के रूप में जाना जाता है। निर्माण के दौरान किसी वस्तु के प्रोटोटाइप को निर्दिष्ट करने की क्षमता जावास्क्रिप्ट के अगले संस्करण का एक हिस्सा होगा और यह होगा घंटी के संकेत __proto__के दिन औपचारिक रूप से गिने जाते हैं।

अल्पावधि में, __proto__यदि आप उन ब्राउज़रों को लक्षित कर रहे हैं, जो इसका समर्थन करते हैं (IE नहीं, तो कभी IE नहीं)। यह संभावना है कि यह अगले 10 वर्षों के लिए webkit और moz में काम करेगा क्योंकि ES6 को 2013 तक अंतिम रूप नहीं दिया जाएगा।

ब्रेंडन ईच - re: ES5 में नई वस्तु विधियों का दृष्टिकोण :

क्षमा करें, ... लेकिन __proto__ऑब्जेक्ट इनिलाइज़र उपयोग के मामले से अलग (निपटाने योग्य, एक नई वस्तु पर, जो अभी तक उपलब्ध नहीं है, ES5 के Object.create के अनुरूप है), एक भयानक विचार है। मैं यह लिखता हूं __proto__कि 12 साल पहले इसे डिजाइन और कार्यान्वित किया गया था।

... स्तरीकरण की कमी एक समस्या है (एक कुंजी के साथ JSON डेटा पर विचार करें "__proto__")। और इससे भी बदतर, उत्परिवर्तन का मतलब है कि कार्यान्वयन को साइकल के प्रोटोटाइप चेन के लिए जांचना चाहिए ताकि ilooping से बचने के लिए। [अनंत पुनरावृत्ति के लिए निरंतर जांच आवश्यक है]

अंत में, __proto__किसी मौजूदा ऑब्जेक्ट पर उत्परिवर्तन नए प्रोटोटाइप ऑब्जेक्ट में गैर-सामान्य तरीकों को तोड़ सकता है, जो संभवतः रिसीवर (प्रत्यक्ष) ऑब्जेक्ट पर काम नहीं कर सकता __proto__है जिसे सेट किया जा रहा है। यह केवल बुरा अभ्यास है, सामान्य रूप में जानबूझकर प्रकार भ्रम का एक रूप है।


बहुत बढ़िया टूट! हालांकि यह एक उत्परिवर्ती प्रोटोटाइप के रूप में काफी समान नहीं है, ECMA हार्मोनी संभवतः प्रॉक्सी को लागू करेगा , जो आपको एक कैटचेल पैटर्न का उपयोग करके विशेष वस्तुओं पर अतिरिक्त कार्यक्षमता को हिला देगा।
निक हशर

2
ब्रेंडन ईच का मुद्दा एक पूरे के रूप में प्रोटोटाइप भाषाओं का मूल है। संभवतः __proto__ बनाने non-writable, configurableसे उपयोगकर्ता इन संपत्तियों को स्पष्ट रूप से संपत्ति को फिर से कॉन्फ़िगर करने के लिए मजबूर करेगा। अंत में, बुरी प्रथाएं किसी भाषा की क्षमताओं के हनन से जुड़ी होती हैं, न कि खुद की क्षमताओं से। लिखने योग्य __proto__ अनसुना नहीं है। कई अन्य गैर-असंख्य गुणात्मक गुण हैं और, जबकि खतरे हैं, साथ ही साथ सर्वोत्तम अभ्यास भी हैं। एक हथौड़ा के सिर को केवल इसलिए नहीं हटाया जाना चाहिए क्योंकि इसका इस्तेमाल किसी को घायल करने के लिए अनुचित तरीके से किया जा सकता है।
कुंडा

स्वचालित रूप से परिवर्तित __proto__की जरूरत है, क्योंकि Object.create केवल वस्तुओं, नहीं कार्यों उदाहरण के लिए, और न ही ऐसे प्रतीक, regexes, डोम तत्वों या अन्य मेजबान वस्तुओं का उत्पादन करेगा। यदि आप चाहते हैं कि आपकी वस्तुएं कॉल करने योग्य हों, या अन्य तरीकों से विशेष हों, लेकिन फिर भी उनकी प्रोटोटाइप श्रृंखला को बदल दें, तो आप __proto__
निपटान योग्य

2
यह बेहतर होगा यदि यह एक जादुई संपत्ति के साथ नहीं किया गया था, बल्कि ऑब्जेक्ट.सेटपोटोटाइप के साथ, " __proto__JSON" चिंता को समाप्त करता है। ब्रेंडन ईच की अन्य चिंताएं हंसी के पात्र हैं। पुनरावर्ती प्रोटोटाइप चेन या दिए गए ऑब्जेक्ट के लिए अपर्याप्त विधियों के साथ एक प्रोटोटाइप का उपयोग करना प्रोग्रामर त्रुटियां हैं, भाषा दोष नहीं और एक कारक नहीं होना चाहिए, और इसके अलावा वे Object.create के साथ-साथ स्वतंत्र रूप से व्यवस्थित होने के साथ भी हो सकते हैं __proto__
user2451227

1
IE 10 का समर्थन करता है __proto__
kzh


14

आप constructorकिसी ऑब्जेक्ट के इंस्टेंस का उपयोग किसी ऑब्जेक्ट के प्रोटोटाइप को बदलने के लिए कर सकते हैं । मेरा मानना ​​है कि यह वही है जो आप करने के लिए कह रहे हैं।

इसका मतलब है अगर आपके पास इसका fooएक उदाहरण है Foo:

function Foo() {}

var foo = new Foo();

आप निम्न करके barसभी उदाहरणों में एक संपत्ति जोड़ सकते हैं Foo:

foo.constructor.prototype.bar = "bar";

यहाँ पर सबूत-कॉन्सेप्ट दिखाने वाली एक फिडेल है: http://jsfiddle.net/C2cpw/ । बहुत निश्चित नहीं है कि पुराने ब्राउज़र इस दृष्टिकोण का उपयोग करके कैसे किराया करेंगे, लेकिन मुझे पूरा यकीन है कि यह काम बहुत अच्छा करना चाहिए।

यदि आपका इरादा वस्तुओं में कार्यक्षमता को मिलाना है, तो इस स्निपेट को काम करना चाहिए:

function mix() {
  var mixins = arguments,
      i = 0, len = mixins.length;

  return {
    into: function (target) {
      var mixin, key;

      if (target == null) {
        throw new TypeError("Cannot mix into null or undefined values.");
      }

      for (; i < len; i += 1) {
        mixin = mixins[i];
        for (key in mixin) {
          target[key] = mixin[key];
        }

        // Take care of IE clobbering `toString` and `valueOf`
        if (mixin && mixin.toString !== Object.prototype.toString) {
          target.toString = mixin.toString;
        } else if (mixin && mixin.valueOf !== Object.prototype.valueOf) {
          target.valueOf = mixin.valueOf;
        }
      }
      return target;
    }
  };
};

1
+1: यह जानकारीपूर्ण और दिलचस्प है, लेकिन वास्तव में मुझे वह नहीं मिलता है जो मुझे चाहिए। मैं अपने प्रश्न को अधिक विशिष्ट होने के लिए अपडेट कर रहा हूं।
विवियन रिवर

आप यह भी उपयोग कर सकते हैंfoo.__proto__.bar = 'bar';
जाम रिसर

9

आप कर सकते हैं foo.__proto__ = FooClass.prototype, AFAIK जो फ़ायरफ़ॉक्स, क्रोम और सफारी द्वारा समर्थित है। ध्यान रखें कि __proto__संपत्ति गैर-मानक है और किसी बिंदु पर दूर जा सकती है।

प्रलेखन: https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Object/proto । स्पष्टीकरण क्यों है और क्यों नहीं निकाला जाता है, इसके स्पष्टीकरण के लिए http://www.mail-archive.com/jsmentors@googlegroups.com/msg00392.html भी देखें ।Object.setPrototypeOf()__proto__


3

आप अपने प्रॉक्सी कंस्ट्रक्टर फ़ंक्शन को परिभाषित कर सकते हैं और फिर एक नया उदाहरण बना सकते हैं और सभी ऑब्जेक्ट को मूल ऑब्जेक्ट से कॉपी कर सकते हैं।

// your original object
var obj = { 'foo': true };

// your constructor - "the new prototype"
function Custom(obj) {
    for ( prop in obj ) {
        if ( obj.hasOwnProperty(prop) ) {
            this[prop] = obj[prop];
        }
    }
}

// the properties of the new prototype
Custom.prototype.bar = true;

// pass your original object into the constructor
var obj2 = new Custom(obj);

// the constructor instance contains all properties from the original 
// object and also all properties inherited by the new prototype
obj2.foo; // true
obj2.bar; // true

लाइव डेमो: http://jsfiddle.net/6Xq3P/

Customनिर्माता नए प्रोटोटाइप, Ergo, अपने प्रतिनिधित्व Custom.prototypeवस्तु सभी नए गुण जो आप अपने मूल उद्देश्य के साथ उपयोग करने के लिए करना चाहते हैं।

Customकंस्ट्रक्टर के अंदर , आप मूल फ़ाइल से नए उदाहरण ऑब्जेक्ट के लिए सभी गुण कॉपी करते हैं।

इस नई आवृत्ति ऑब्जेक्ट में मूल ऑब्जेक्ट से सभी गुण होते हैं (वे इसे कन्स्ट्रक्टर के अंदर कॉपी किए गए थे), और साथ ही अंदर परिभाषित सभी नए गुण Custom.prototype(क्योंकि नई वस्तु एक Customउदाहरण है)।


3

आप एक जावास्क्रिप्ट ऑब्जेक्ट के प्रोटोटाइप को नहीं बदल सकते हैं जो पहले से ही क्रॉस ब्राउज़र तरीके से इंस्टेंट किया गया है। जैसा कि दूसरों ने उल्लेख किया है, आपके विकल्पों में शामिल हैं:

  1. गैर मानक / क्रॉस ब्राउज़र __proto__संपत्ति को बदलना
  2. ऑब्जेक्ट के गुणों को किसी नई ऑब्जेक्ट पर कॉपी करें

न तो विशेष रूप से महान हैं, खासकर यदि आपको किसी ऑब्जेक्ट के माध्यम से आंतरिक रूप से पूरे प्रोटोटाइप को प्रभावी ढंग से बदलने के लिए एक वस्तु के माध्यम से पुनरावृत्ति करना है।

प्रश्न का वैकल्पिक हल

मैं कार्यक्षमता पर एक अधिक सारगर्भित रूप लेने जा रहा हूँ, यह आपकी इच्छा को प्रदर्शित करता है।

मूल रूप से प्रोटोटाइप / विधियाँ केवल एक वस्तु के आधार पर समूह कार्यों के लिए एक मार्ग की अनुमति देती हैं।
लिखने के बजाय

function trim(x){ /* implementation */ }
trim('   test   ');

तुम लिखो

'   test  '.trim();

उपरोक्त सिंटैक्स को ऑब्जेक्ट.मिथोड () सिंटैक्स के कारण ओओपी शब्द गढ़ा गया है। पारंपरिक कार्यात्मक प्रोग्रामिंग पर OOP के मुख्य लाभ में से कुछ में शामिल हैं:

  1. छोटे तरीकों के नाम और कम चर obj.replace('needle','replaced')बनाम जैसे नाम str_replace ( 'foo' , 'bar' , 'subject')और विभिन्न चर के स्थान को याद रखने के लिए
  2. विधि जंजीर ( string.trim().split().join()) फिर नेस्टेड फ़ंक्शन को संशोधित करने और लिखने के लिए संभावित रूप से आसान हैjoin(split(trim(string))

दुर्भाग्य से जावास्क्रिप्ट में (जैसा कि ऊपर दिखाया गया है) आप पहले से मौजूद प्रोटोटाइप को संशोधित नहीं कर सकते। आदर्श रूप से ऊपर आप Object.prototypeकेवल दिए गए ऑब्जेक्ट के ऊपर के लिए संशोधित कर सकते हैं , लेकिन दुर्भाग्य से संशोधन Object.prototypeसंभावित रूप से स्क्रिप्ट को तोड़ देगा (जिसके परिणामस्वरूप संपत्ति टकराव और ओवरराइडिंग होगी)।

प्रोग्रामिंग की इन 2 शैलियों के बीच आमतौर पर उपयोग नहीं किया जाने वाला मध्य मैदान है, और कस्टम कार्यों को व्यवस्थित करने के लिए कोई ओओपी तरीका नहीं है।

UnlimitJS एक मध्य मैदान प्रदान करता है जो आपको कस्टम विधियों को परिभाषित करने की अनुमति देता है। इससे बचा जाता है:

  1. संपत्ति टकराव, क्योंकि यह वस्तुओं के प्रोटोटाइप का विस्तार नहीं करता है
  2. फिर भी एक OOP श्रृंखलित वाक्य रचना के लिए अनुमति देता है
  3. यह 450 बाइट क्रॉस ब्राउज़र है (IE6 +, फ़ायरफ़ॉक्स 3.0 +, क्रोम, ओपेरा, सफारी 3.0+) स्क्रिप्ट जो कि Unlimit की जावास्क्रिप्ट के प्रोटोटाइप की संपत्ति के टकराव के मुद्दों से बहुत अधिक है

ऊपर दिए गए अपने कोड का उपयोग करते हुए मैं बस उन फ़ंक्शन का नाम स्थान बनाऊंगा जिन्हें आप ऑब्जेक्ट के विरुद्ध कॉल करना चाहते हैं।

यहाँ एक उदाहरण है:

var foo = [{"A":"1","B":"2"},{"X":"7","Y":"8"}];

// define namespace with methods
var $ = {
  log:function(){
    console.log(this);
    return this;
  }[Unlimit](),
  alert:function(){
    alert(''+this);
  }[Unlimit]()
}


foo[$.log]()
   [$.log]()
   [$.alert]();

आप यहाँ उदाहरण के और अधिक पढ़ सकते हैं UnlimitJS । मूल रूप से जब आप [Unlimit]()किसी फ़ंक्शन पर कॉल करते हैं, तो यह फ़ंक्शन को ऑब्जेक्ट पर एक विधि के रूप में कहा जाता है। यह ओओपी और कार्यात्मक सड़कों के बीच एक मध्य मैदान की तरह है।


2

आप बदल नहीं सकते [[prototype]]जहाँ तक मुझे पता है पहले से निर्मित वस्तुओं संदर्भ । आप मूल निर्माता फ़ंक्शन की प्रोटोटाइप संपत्ति को बदल सकते हैं लेकिन, जैसा कि आप पहले ही टिप्पणी कर चुके हैं, कि निर्माता है Object, और कोर जेएस निर्माणों को बदलना एक खराब बात है।

आप निर्मित वस्तु का एक प्रॉक्सी ऑब्जेक्ट बना सकते हैं जो अतिरिक्त कार्यक्षमता को लागू करता है जिसकी आपको आवश्यकता है, हालांकि। आप प्रश्न में ऑब्जेक्ट को सीधे असाइन करके अतिरिक्त तरीकों और व्यवहारों को भी बंद कर सकते हैं।

शायद आप वह प्राप्त कर सकते हैं जो आप किसी अन्य तरीके से चाहते हैं, यदि आप एक अलग कोण से संपर्क करने के लिए तैयार हैं: आपको क्या करने की आवश्यकता है जिसमें प्रोटोटाइप के साथ गड़बड़ करना शामिल है?


क्या कोई और भी इस की सटीकता पर टिप्पणी कर सकता है?
विवियन रिवर

ऐसा प्रतीत होता है, इस भयानक jsfiddle के आधार पर कि आप किसी मौजूदा ऑब्जेक्ट के प्रोटोटाइप को उसकी __proto__संपत्ति में परिवर्तन करके बदल सकते हैं। यह केवल उन ब्राउज़रों में काम करेगा __proto__जो संकेतन का समर्थन करते हैं, जो क्रोम और फ़ायरफ़ॉक्स है, और इसे हटा दिया गया है । तो, संक्षेप में, आप [[prototype]]एक वस्तु को बदल सकते हैं , लेकिन आपको शायद ऐसा नहीं करना चाहिए।
निक हशर

1

यदि आप प्रोटोटाइप जानते हैं, तो इसे कोड में इंजेक्ट क्यों नहीं किया जाता है?

var foo = new MyPrototype(<%= MyData %>);

इसलिए, डेटा को क्रमबद्ध करने के बाद, आप प्राप्त करते हैं

var foo = new MyPrototype([{"A":"1","B":"2"},{"X":"7","Y":"8"}]);

अब आपको केवल एक रचनाकार की जरूरत है जो तर्क के रूप में एक सरणी लेता है।


0

वास्तव में विरासत से कोई रास्ता नहीं है Array या "उप-वर्ग" है।

आप यह कर सकते हैं ( चेतावनी: निस्तारण कोड अहद ):

function Foo(arr){
  [].push.apply(this, arr)
}
Foo.prototype = []
Foo.prototype.something = 123

var foo = new Foo(<%=MyData %>)

foo.length // => 2
foo[0] // => {"A":"1","B":"2"}
foo.something // => 123

यह काम करता है, लेकिन किसी के लिए कुछ परेशानी पैदा करेगा जो इसे पार करता है (यह एक सरणी की तरह दिखता है, लेकिन अगर आप इसे हेरफेर करने की कोशिश करते हैं तो चीजें गलत हो जाएंगी)।

आप साने मार्ग पर क्यों नहीं जाते हैं और एक विधायक के रूप में विधियों / गुणों को सीधे जोड़ते हैं foo, या एक संपत्ति के रूप में अपने सरणी को बचाते हैं?

function Foo(arr){
  this.items = arr
}
Foo.prototype = {
  someMethod : function(){ ... }
  //...
}

var foo = new Foo(<%=MyData %>)
foo.items // => [{"A":"1","B":"2"},{"X":"7","Y":"8"}]

0

यदि आप मक्खी पर प्रोटोटाइप बनाना चाहते हैं, तो यह एक तरीका है

function OntheFlyProto (info){
    this.items = info;
    this.y =-1;
    for(var i = 0; i < this.items.length ; i++){
        OntheFlyProto.prototype["get"+this.items[i].name] = function (){
            this.y++;
            return this.items[this.y].value;
        }
    }
}

var foo = [{name:"one", value:1},{name:"two", value:2}];
v = new OntheFlyProto(foo);

-1
foo.prototype.myFunction = function(){alert("me");}

नहीं, आप नहीं कर सकते। वह स्थिर संपत्ति है।
SLKs

@ एसएलएस prototypeस्थिर है? मुझे नहीं पता तुम्हारा क्या मतलब है।
26इमे विद्या

1
prototypeएक समारोह की एक संपत्ति है, एक वस्तु नहीं है। Object.prototypeमौजूद; {}.prototypeऐसा नहीं करता।
SLKs

यदि आप ब्राउज़र संगतता के बारे में परवाह नहीं करते हैं, तो आप Object.getPrototypeOf(foo)कंस्ट्रक्टर प्रोटोटाइप ऑब्जेक्ट प्राप्त करने के लिए उपयोग कर सकते हैं । आप ऑब्जेक्ट के प्रोटोटाइप को संशोधित करने के लिए उस पर गुणों को संशोधित कर सकते हैं। यह केवल हाल के ब्राउज़रों में काम करता है, आपको यह नहीं बता सकता कि कौन से हैं, हालांकि।
निक हशर

@TeslaNick: आप Object.prototypeसीधे जा सकते हैं और सीधे संशोधित कर सकते हैं क्योंकि यह सबसे अधिक संभावना है कि क्या Object.getPrototypeOf(foo)वापस आएगा। बहुत उपयोगी नहीं है।
व्लादिमीर पालंट
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.