ইতিমধ্যে ইনস্ট্যান্ট করা একটি জাভাস্ক্রিপ্ট অবজেক্টের প্রোটোটাইপ কীভাবে সেট করবেন?


106

ধরুন fooআমার জাভাস্ক্রিপ্ট কোডটিতে আমার একটি অবজেক্ট রয়েছে। fooএকটি জটিল অবজেক্ট এবং এটি অন্য কোথাও তৈরি হয়েছে। কীভাবে আমি fooঅবজেক্টের প্রোটোটাইপ পরিবর্তন করতে পারি ?

আমার অনুপ্রেরণা। নেট থেকে জাভাস্ক্রিপ্ট লিটারালগুলিতে সিরিয়ালযুক্ত অবজেক্টগুলিতে উপযুক্ত প্রোটোটাইপ সেট করছে।

মনে করুন যে আমি একটি এএসপি.নেট পৃষ্ঠার মধ্যে নিম্নলিখিত জাভাস্ক্রিপ্ট কোড লিখেছি।

var foo = <%=MyData %>;

মনে করুন এটি কোনও বস্তুর উপর MyData.NET আহ্বানের ফলাফল ।JavaScriptSerializerDictionary<string,string>

রান-টাইমে, এটি নিম্নলিখিত হয়ে যায়:

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

আপনি দেখতে পাচ্ছেন, fooবস্তুর একটি অ্যারে হয়ে যায়। আমি fooএকটি উপযুক্ত প্রোটোটাইপ দিয়ে আরম্ভ করতে সক্ষম হতে চাই । আমি নাও পরিবর্তন করতে চাই Object.prototypeনা Array.prototype। কিভাবে আমি এটি করতে পারব?


আপনি কি এর বিদ্যমান প্রোটোটাইপটিতে যুক্ত করতে চান বা এটি একটি নতুন প্রোটোটাইপে স্যুইচ করতে চান?
স্ল্যাक्स

আপনি কি প্রোটোটাইপ পরিবর্তন করতে চান - বা একটি প্রোটোটাইপ স্যুইচ আউট হিসাবে এবং প্রকৃতপক্ষে প্রোটোটাইপ পরিবর্তন হিসাবে এটি অন্য একটি সঙ্গে প্রতিস্থাপন। আমি পরে নিশ্চিত যে এটি সম্ভব কিনা।
জেমস গ্যান্ট

2
আপনার অর্থ কি সুস্পষ্ট প্রোটোটাইপ সম্পত্তি বা অন্তর্নিহিত প্রোটোটাইপ লিঙ্ক? (এই দুটি দুটি খুব আলাদা জিনিস)
Vidime বিদাস

আমি মূলত এর সাথেই উদ্বিগ্ন ছিলাম: স্ট্যাকওভারফ্লো.com
ভিভিয়ান নদী

1
আপনি কি ব্যাকবোন extendবা গুগলের সাথে পরিচিত goog.inherit? অনেক বিকাশকারী প্রবীণ newকন্সট্রাক্টরকে কল করার আগে উত্তরাধিকার গড়ে তোলার উপায় সরবরাহ করে — যা আমাদের দেওয়ার আগে Object.createএবং ওভাররাইড নিয়ে চিন্তা করার দরকার নেই Object.prototype
রায়ান

উত্তর:


114

ফেব্রুয়ারী ২০১২ সম্পাদনা করুন: নীচের উত্তরগুলি এখন আর সঠিক নয়। __প্রোট__ ECMAScript 6 এ "আদর্শিক alচ্ছিক" হিসাবে যুক্ত করা হচ্ছে যার অর্থ এটি কার্যকর করার প্রয়োজন হয় না তবে যদি তা হয় তবে অবশ্যই এটি প্রদত্ত বিধিগুলির সেটটি অনুসরণ করবে। এটি বর্তমানে অমীমাংসিত তবে কমপক্ষে এটি আনুষ্ঠানিকভাবে জাভাস্ক্রিপ্টের স্পেসিফিকেশনের অংশ হবে।

জাভাস্ক্রিপ্ট অভ্যন্তরীণ জ্ঞানের ক্ষেত্রে এই প্রশ্নটি পৃষ্ঠতলের চেয়ে মনে হয় এবং বেশিরভাগ লোকের বেতন গ্রেডের বাইরে অনেক জটিল।

prototypeএকটি বস্তুর সম্পত্তি যখন যে বস্তুর নতুন শিশু বস্তু তৈরি ব্যবহার করা হয়। এটি পরিবর্তন করলে তা বস্তুটিতেই প্রতিফলিত হয় না, বরং সেই বস্তুটি যখন অন্য বস্তুর জন্য নির্মাতা হিসাবে ব্যবহৃত হয় এবং এর কোনও বিদ্যমান অবজেক্টের প্রোটোটাইপ পরিবর্তনে কোনও ব্যবহার হয় না তখন তা প্রতিফলিত হয়।

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

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

অবজেক্টগুলির একটি অভ্যন্তরীণ [[প্রোটোটাইপ]] সম্পত্তি রয়েছে যা বর্তমান প্রোটোটাইপের দিকে নির্দেশ করে। এটি যেভাবে কাজ করে তা হ'ল যখনই কোনও বস্তুর কোনও সম্পত্তি বলা হয় তখন এটি বস্তু থেকে শুরু হবে এবং তারপরে [[প্রোটোটাইপ]] শৃঙ্খলে চলে যাবে যতক্ষণ না এটি কোনও মিল খুঁজে পায়, বা ব্যর্থ হয় না, মূল অবজেক্ট প্রোটোটাইপের পরে। জাভাস্ক্রিপ্ট এভাবে রানটাইম বিল্ডিং এবং অবজেক্টগুলির পরিবর্তন করার অনুমতি দেয়; এটির যা প্রয়োজন তা অনুসন্ধান করার জন্য এটির পরিকল্পনা রয়েছে।

__proto__সম্পত্তি (বর্তমানে অনেক) কিছু বাস্তবায়নের বিদ্যমান: কোনো মোজিলা বাস্তবায়ন, সমস্ত WebKit বেশী আমি জানি, কিছু অন্যদের। এই সম্পত্তিটি অভ্যন্তরীণ [[প্রোটোটাইপ]] বৈশিষ্ট্যকে নির্দেশ করে এবং অবজেক্টগুলিতে সংশোধন পরবর্তী পোস্টের অনুমতি দেয়। এই শৃঙ্খলিত দেখার কারণে কোনও বৈশিষ্ট্য এবং ফাংশন তাত্ক্ষণিকভাবে প্রোটোটাইপের সাথে মেলে।

এই বৈশিষ্ট্যটি এখন মানসম্পন্ন হওয়ার পরেও জাভাস্ক্রিপ্টের প্রয়োজনীয় অংশ নয়, এবং এটি সমর্থনকারী ভাষাগুলিতে আপনার কোডটিকে "বিনা চাপড়িত" বিভাগে ফেলে দেওয়ার উচ্চ সম্ভাবনা রয়েছে। জেএস ইঞ্জিনগুলিকে কোড শ্রেণীবদ্ধ করার জন্য তাদের সর্বোত্তম চেষ্টা করতে হবে, বিশেষত "হট" কোড যা খুব ঘন ঘন অ্যাক্সেস করা হয় এবং আপনি যদি সংশোধন করার মতো অভিনব কিছু করছেন তবে __proto__তারা আপনার কোডটি একেবারেই অনুকূলিত করবে না।

এই পোস্টগুলিতে https://bugzilla.mozilla.org/show_bug.cgi?id=607863 বর্তমান বাস্তবায়ন __proto__এবং তাদের মধ্যে পার্থক্য সম্পর্কে বিশেষভাবে আলোচনা করেছে। প্রতিটি বাস্তবায়ন এটি আলাদাভাবে করে, কারণ এটি একটি শক্ত এবং সমাধান না করা সমস্যা। জাভাস্ক্রিপ্ট সবকিছু একটি ব্যতীত চপল হয়।) সিনট্যাক্স খ।) হোস্ট বস্তু (করে DOM টেকনিক্যালি জাভাস্ক্রিপ্ট বাইরে বিদ্যমান) এবং গ।) __proto__। বাকীটি সম্পূর্ণরূপে আপনার এবং অন্য প্রতিটি বিকাশকারীর হাতে রয়েছে, তাই আপনি দেখতে পাচ্ছেন যে কেন __proto__ঘাড়ে থাম্বের মতো লাঠি ফেলে।

একটি জিনিস যা এর __proto__জন্য মঞ্জুরি দেয় তা অন্যথায় করা অসম্ভব: রান্টটাইমে কোনও অবজেক্টের প্রোটোটাইপ এর নির্মাতা থেকে পৃথক করে রাখা। এটি একটি গুরুত্বপূর্ণ ব্যবহারের কেস এবং এটি প্রাথমিক কারণগুলির মধ্যে একটি __proto__যা ইতিমধ্যে মারা যায় নি। এটি যথেষ্ট গুরুত্বপূর্ণ যে এটি সুরেলা তৈরির ক্ষেত্রে একটি গুরুতর আলোচনার বিষয় হয়ে দাঁড়িয়েছে বা শীঘ্রই ECMAScript হিসাবে পরিচিত হবে 6.. সৃষ্টির সময় কোনও বস্তুর প্রোটোটাইপ নির্দিষ্ট করার ক্ষমতা জাভাস্ক্রিপ্টের পরবর্তী সংস্করণের অংশ হবে এবং এটি হবে বেলগুলি নির্দেশ করে যে __proto__দিনগুলি আনুষ্ঠানিকভাবে গণনা করা হয়।

স্বল্প মেয়াদে, আপনি __proto__যদি এটি সমর্থন করে এমন ব্রাউজারগুলিকে লক্ষ্য করে থাকেন তবে আপনি ব্যবহার করতে পারেন (আইআই নয়, এবং কোনও আইই কখনও তা করবে না)। সম্ভবত এটি আগামী 10 বছর ওয়েবকিট এবং মোজেটে কাজ করবে কারণ 2013 পর্যন্ত ES6 চূড়ান্ত হবে না।

ব্রেন্ডন আইচ - পুনরায়: ES5 তে নতুন অবজেক্ট পদ্ধতির পদ্ধতির :

দুঃখিত, ... তবে নিষ্পত্তিযোগ্য __proto__, অবজেক্ট ইনিশিয়ালার ব্যবহারের ক্ষেত্রে (যেমন, কোনও নতুন অবজেক্টে এখনও পৌঁছনীয় নয়, ES5 এর অবজেক্ট.ক্রিয়েটের সাথে সাদৃশ্য) এক ভয়ঙ্কর ধারণা। আমি এটি __proto__12 বছর আগে স্থিতাবস্থায় ডিজাইন এবং প্রয়োগ করে লিখেছি ।

... স্তরীকরণের অভাব একটি সমস্যা (একটি কী দিয়ে জেএসএন ডেটা বিবেচনা করুন "__proto__")। আরও খারাপ, পরিবর্তনের অর্থ বাস্তবায়নগুলি অবশ্যই ইলুপিং এড়ানোর জন্য চক্রীয় প্রোটোটাইপ চেইনের জন্য পরীক্ষা করতে হবে। [অসীম পুনরাবৃত্তির জন্য ধ্রুবক চেকগুলি প্রয়োজনীয়]

অবশেষে, __proto__বিদ্যমান অবজেক্টের পরিবর্তনের ফলে নতুন প্রোটোটাইপ অবজেক্টে অ-জেনেরিক পদ্ধতিগুলি ভেঙে যেতে পারে, যা সম্ভবত রিসিভার (ডাইরেক্ট) অবজেক্টে কাজ করতে পারে না যার __proto__জন্য সেট করা হচ্ছে। এটি সাধারণভাবে অভ্যাস যা সাধারণভাবে ইচ্ছাকৃত ধরণের বিভ্রান্তির একটি রূপ।


দুর্দান্ত ব্রেকডাউন! যদিও এটি কোনও পরিবর্তনীয় প্রোটোটাইপ হিসাবে একেবারে একই জিনিস নয়, ইসিএমএ হারমনি সম্ভবত প্রক্সিগুলি বাস্তবায়ন করবে , যা আপনাকে ক্যাচল প্যাটার্নটি ব্যবহার করে নির্দিষ্ট কার্যগুলিতে অতিরিক্ত কার্যকারিতা ঝাঁকিয়ে দেয়।
নিক হুশার

2
ব্রেন্ডন আইচের ইস্যুটি সম্পূর্ণরূপে প্রোটোটাইপিং ভাষার স্থানীয়। সম্ভবত __ প্রোফাইল__ তৈরি করা non-writable, configurableব্যবহারকারীকে স্পষ্টভাবে সম্পত্তি পুনরায় কনফিগার করতে বাধ্য করে এই উদ্বেগগুলির সমাধান করবে। শেষ অবধি, খারাপ অভ্যাসগুলি কোনও ভাষার ক্ষমতার অপব্যবহারের সাথে যুক্ত হয়, নিজের ক্ষমতাগুলি নয়। লিখিত __ প্রোফাইল__ শোনা যায় না। অন্যান্য অনেকগুলি অ-গণনাযোগ্য লিখিতযোগ্য বৈশিষ্ট্য রয়েছে এবং বিপদগুলি থাকা সত্ত্বেও সর্বোত্তম অনুশীলনগুলিও রয়েছে। হাতুড়ির মাথাটি কেবল সরানো উচিত নয় কারণ এটি কাউকে ক্ষত দেওয়ার জন্য ভুলভাবে ব্যবহার করা যেতে পারে।
সুইভেল

Mutating __proto__প্রয়োজন হয়, কারণ Object.create শুধুমাত্র অবজেক্টস, না ফাংশন উদাহরণস্বরূপ, কিংবা প্রতীক, Regexes, DOM উপাদানে বা অন্যান্য হোস্ট বস্তু উত্পাদন করা হবে। আপনি যদি চান যে আপনার অবজেক্টগুলি কলযোগ্য, বা অন্যভাবে বিশেষ হতে পারে তবে তার প্রোটোটাইপ চেইনটি পরিবর্তন করুন, আপনি __proto__
স্থিরযোগ্য

2
এটা তোলে ভালো হতে যদি এটি একটি ঐন্দ্রজালিক সম্পত্তি যদিও কিন্তু এর পরিবর্তে Object.setPrototype সঙ্গে না করা হয়, "দূর হবে __proto__তাদেরকে JSON মধ্যে" উদ্বেগ। ব্রেন্ডন আইচের অন্যান্য উদ্বেগ হাস্যকর। পুনরাবৃত্ত প্রোটোটাইপ চেইন বা প্রদত্ত বস্তুর জন্য অপর্যাপ্ত পদ্ধতিগুলির সাথে একটি প্রোটোটাইপ ব্যবহার হ'ল প্রোগ্রামার ত্রুটিগুলি, ভাষার ত্রুটি নয় এবং এটি একটি ফ্যাক্টর হওয়া উচিত নয় এবং এগুলি ছাড়াও তারা অবজেক্ট.ক্রিয়েটের পাশাপাশি অবাধে স্থায়ীভাবে স্থিরযোগ্য হতে পারে __proto__
ব্যবহারকারীর 45451227

1
আইই 10 সমর্থন করে __proto__
KZ


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, ফায়ারফক্স, ক্রোম এবং সাফারি দ্বারা সমর্থিত এএফআইএকে। মনে রাখবেন যে __proto__সম্পত্তিটি মান-মানসম্পন্ন নয় এবং কোনও কোনও সময়ে চলে যেতে পারে।

ডকুমেন্টেশন: https://developer.mozilla.org/en/JavaScript/ উল্লেখ / গ্লোবাল_অবজেক্টস / অবজেক্ট / প্রোটো । কেন নেই এবং কেন অবমূল্যায়ন করা হয়েছে তার ব্যাখ্যার জন্য 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কন্সট্রাকটর নতুন প্রোটোটাইপ, অতএব, তার প্রতিনিধিত্ব করে Custom.prototypeবস্তুর সব নতুন বৈশিষ্ট্য যা আপনাকে আপনার মূল বস্তুর সঙ্গে ব্যবহার করতে চান সেটি রয়েছে।

Customকনস্ট্রাক্টরের অভ্যন্তরে , আপনি কেবলমাত্র আসল বস্তু থেকে সমস্ত নতুন বৈশিষ্ট্যটিকে নতুন দৃষ্টান্তের অবজেক্টে অনুলিপি করুন।

এই নতুন ইনস্ট্যান্স অবজেক্টটিতে মূল অবজেক্ট থেকে সমস্ত বৈশিষ্ট্য রয়েছে (সেগুলি কন্সট্রাক্টরের অভ্যন্তরে এটি অনুলিপি করা হয়েছিল), এবং ভিতরে নতুন সংজ্ঞাযুক্ত সমস্ত নতুন বৈশিষ্ট্য রয়েছে Custom.prototype(কারণ নতুন বস্তুটি একটি Customউদাহরণ)।


3

ইতিমধ্যে ক্রস ব্রাউজার উপায়ে ইনস্ট্যান্ট করা জাভাস্ক্রিপ্ট অবজেক্টের প্রোটোটাইপটি আপনি পরিবর্তন করতে পারবেন না। অন্যরা যেমন উল্লেখ করেছে, আপনার বিকল্পগুলির মধ্যে রয়েছে:

  1. অ-স্ট্যান্ডার্ড / ক্রস ব্রাউজারের __proto__সম্পত্তি পরিবর্তন করা
  2. নতুন বস্তুতে অবজেক্ট বৈশিষ্ট্য অনুলিপি করুন

উভয়ই বিশেষত দুর্দান্ত নয়, বিশেষত যদি কোনও উপাদানগুলির পুরো প্রোটোটাইপকে কার্যকরভাবে পরিবর্তন করতে আপনাকে কোনও বস্তুর মধ্যবর্তী বস্তুগুলির মধ্যে পুনরাবৃত্তভাবে লুপ করতে হয়।

প্রশ্নের বিকল্প সমাধান

আমি যে কার্যকারিতাটি দেখায় এটির চেয়ে আরও বিমূর্ত দৃষ্টিপাত করতে চলেছি।

মূলত প্রোটোটাইপ / পদ্ধতিগুলি কেবল কোনও অবজেক্টের উপর ভিত্তি করে গ্রুপ ফাংশন করার জন্য অনুমতি দেয়।
লেখার বদলে

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

তুমি লেখ

'   test  '.trim();

উপরের সিনট্যাক্সটি OOP শব্দটি তৈরি করা হয়েছে কারণ অবজেক্ট.মোথড () সিনট্যাক্সের কারণে। Traditionalতিহ্যবাহী ফাংশনাল প্রোগ্রামিংয়ের উপর ওওপিগুলির কয়েকটি প্রধান সুবিধা অন্তর্ভুক্ত:

  1. সংক্ষিপ্ত পদ্ধতির নাম এবং কম ভেরিয়েবল obj.replace('needle','replaced')বনাম এর মত নামগুলি str_replace ( 'foo' , 'bar' , 'subject')এবং বিভিন্ন ভেরিয়েবলের অবস্থান মনে রাখা
  2. পদ্ধতি শৃঙ্খলা ( string.trim().split().join()) পরে নেস্টেড ফাংশনগুলি সংশোধন করা এবং লেখার পক্ষে সম্ভাব্য সহজjoin(split(trim(string))

দুর্ভাগ্যক্রমে জাভাস্ক্রিপ্টে (উপরে প্রদর্শিত হিসাবে) আপনি ইতিমধ্যে বিদ্যমান প্রোটোটাইপ পরিবর্তন করতে পারবেন না। আদর্শভাবে উপরে আপনি Object.prototypeকেবলমাত্র প্রদত্ত অবজেক্টের উপরেরটির জন্য সংশোধন করতে পারবেন , তবে দুর্ভাগ্যক্রমে সংশোধন Object.prototypeকরলে স্ক্রিপ্টগুলি সম্ভাব্যভাবে ভেঙে যাবে (যার ফলে সম্পত্তি সংঘর্ষ ও ওভাররাইডিং হবে)।

এই 2 টি স্টাইলের প্রোগ্রামিংয়ের মধ্যে সাধারণত ব্যবহৃত কোনও মাঝারি গ্রাউন্ড নেই এবং কাস্টম ফাংশনগুলি সংগঠিত করার জন্য কোনও ওওপি উপায় নেই।

আনলিমিটজেএস একটি মাঝারি জমি সরবরাহ করে যা আপনাকে কাস্টম পদ্ধতিগুলি সংজ্ঞায়িত করতে দেয়। এটি এড়ানো:

  1. সম্পত্তির সংঘর্ষ, কারণ এটি অবজেক্টের প্রোটোটাইপগুলি প্রসারিত করে না
  2. তবুও একটি ওওপি চেইন সিনট্যাক্সের অনুমতি দেয়
  3. এটি 450 বাইট ক্রস ব্রাউজার (আই 6 +, ফায়ারফক্স 3.0 +, ক্রোম, অপেরা, সাফারি 3.0+) স্ক্রিপ্ট যা আনলিমিটের জাভাস্ক্রিপ্টের প্রোটোটাইপ সম্পত্তি সংঘর্ষের সমস্যাগুলির অনেকটাই

উপরের আপনার কোড ব্যবহার করে আমি কেবল ফাংশনগুলির একটি নেমস্পেস তৈরি করব যা আপনি অবজেক্টটির বিরুদ্ধে কল করতে চান।

এখানে একটি উদাহরণ:

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]();

আপনি এখানে উদাহরণগুলি আরও পড়তে পারেন আনলিমিটজেএস । মূলত আপনি যখন [Unlimit]()কোনও ফাংশনে ডাকেন , তখন এটি ফাংশনটিকে কোনও অবজেক্টের পদ্ধতি হিসাবে কল করার অনুমতি দেয়। এটি ওওপি এবং কার্যকরী রাস্তাগুলির মধ্যবর্তী মাঝের মতো।


2

[[prototype]]আমি যতদূর জানি ইতিমধ্যে নির্মিত-অবজেক্টের রেফারেন্স আপনি পরিবর্তন করতে পারবেন না । আপনি মূল কন্সট্রাক্টর ফাংশনটির প্রোটোটাইপ সম্পত্তি পরিবর্তন করতে পারেন তবে আপনি ইতিমধ্যে মন্তব্য করেছেন যে নির্মাণকর্তা Objectএবং মূল জেএস কনস্ট্রাক্টসকে পরিবর্তন করা একটি খারাপ কাজ।

যদিও আপনি নির্ধারিত অবজেক্টের একটি প্রক্সি অবজেক্ট তৈরি করতে পারেন যা আপনার প্রয়োজন অতিরিক্ত ক্রিয়াকলাপ কার্যকর করে। আপনি প্রশ্নে সরাসরি বস্তুটিতে সরাসরি নিয়োগ করে অতিরিক্ত পদ্ধতি এবং আচরণগুলি বানরপ্যাচ করতে পারেন।

আপনি অন্য কোনও উপায়ে যেতে চাইলে আপনি যা পেতে পারেন তা সম্ভবত আপনি পেতে পারেন: প্রোটোটাইপের সাথে জগাখিচির সাথে জড়িত জড়িত জড়িত জড়িত আপনার কী করা উচিত?


এর নির্ভুলতার বিষয়ে অন্য কেউ মন্তব্য করতে পারেন?
ভিভিয়ান নদী

এই ভয়াবহ জেসফিডেলের উপর ভিত্তি করে এটি উপস্থিত হয় যে আপনি বিদ্যমান বস্তুর বৈশিষ্ট্য পরিবর্তন করে এটির প্রোটোটাইপ পরিবর্তন করতে পারবেন __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");}

না, আপনি পারবেন না। এটি একটি স্থির সম্পত্তি।
স্ল্যাक्स

@ এসলাক্স prototypeস্থির? আপনি কি বোঝাতে চাচ্ছেন তা আমি নিশ্চিত নই.
Vidime বিদাস

1
prototypeকোনও ফাংশনের সম্পত্তি, কোনও বস্তুর নয়। Object.prototypeবিদ্যমান; {}.prototypeনা।
এসএলএক্স

আপনি যদি ব্রাউজারের সামঞ্জস্যতা সম্পর্কে চিন্তা না করেন তবে আপনি Object.getPrototypeOf(foo)কনস্ট্রাক্টর প্রোটোটাইপ অবজেক্টটি পেতে ব্যবহার করতে পারেন । আপনি বস্তুর প্রোটোটাইপটি সংশোধন করতে এতে থাকা বৈশিষ্ট্যগুলি সংশোধন করতে পারেন। এটি কেবল সাম্প্রতিক ব্রাউজারগুলিতে কাজ করে, তবে কোনটি আপনাকে তা বলতে পারে না।
নিক হুশার

@ টেসলানিক: আপনি কেবল গিয়ে Object.prototypeসরাসরি সংশোধন করতে পারেন কারণ সম্ভবত এটিই Object.getPrototypeOf(foo)ফিরে আসবে। খুব দরকারী না।
ও্লাদিমির প্যালান্ট
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.