কিভাবে জাভাস্ক্রিপ্ট অবজেক্টের ক্লাস পাবেন?


728

আমি একটি জাভাস্ক্রিপ্ট অবজেক্ট তৈরি করেছি, তবে কীভাবে আমি সেই বস্তুর শ্রেণি নির্ধারণ করতে পারি?

আমি জাভা .getClass()পদ্ধতির অনুরূপ কিছু চাই ।


6
উদাহরণস্বরূপ, আমি এইরকম একটি ব্যক্তি তৈরি করি: var p = নতুন ব্যক্তি (); আমার একটি ব্যক্তি অবজেক্ট রয়েছে যার নাম "পি", আমি কীভাবে ক্লাসের নাম ফিরে পেতে "পি" ব্যবহার করতে পারি: "ব্যক্তি"।
DNB5brims


আপডেট: ECMAScript 6 হিসাবে, জাভাস্ক্রিপ্টের এখনও কোনও classপ্রকার নেই। এটা তোলে করেন একটি আছে classশব্দ এবং classএগুলির নমুনা, যা পদ্ধতি আরো সহজে অ্যাক্সেস করতে পারবেন তৈরি করার জন্য সিনট্যাক্স super
james_womack

Object.className সম্পর্কে কী?
পল বাসেনকো

@ পল-বেসেনকো: "শ্রেণীর নাম" আপনাকে অবজেক্টের শ্রেণি বলবে না, তবে এইচটিএমএল উপাদানটির "শ্রেণি" বৈশিষ্ট্যের বিষয়বস্তু ফিরিয়ে দেবে, যা সিএসএস ক্লাসকে বোঝায়। এগুলি সহজে পরিচালনা করার জন্য আপনি "ক্লাসলিস্ট" ব্যবহার করতে চান তবে এটি ওপির প্রশ্নের সাথে সম্পর্কিত নয়।
ওবিসিডিয়ান

উত্তর:


1009

getClass()জাভাস্ক্রিপ্টে জাভা সম্পর্কিত কোনও সঠিক প্রতিরূপ নেই । বেশিরভাগ ক্ষেত্রে এটি জাভাস্ক্রিপ্ট একটি প্রোটোটাইপ-ভিত্তিক ভাষা হওয়ার কারণে , জাভা ক্লাস-ভিত্তিক ভাষা হওয়ার বিপরীতে ।

আপনার যা প্রয়োজন তার উপর নির্ভর করে getClass()জাভাস্ক্রিপ্টে বেশ কয়েকটি বিকল্প রয়েছে:

কয়েকটি উদাহরণ:

function Foo() {}
var foo = new Foo();

typeof Foo;             // == "function"
typeof foo;             // == "object"

foo instanceof Foo;     // == true
foo.constructor.name;   // == "Foo"
Foo.name                // == "Foo"    

Foo.prototype.isPrototypeOf(foo);   // == true

Foo.prototype.bar = function (x) {return x+x;};
foo.bar(21);            // == 42

দ্রষ্টব্য: আপনি যদি নিজের কোডটি ইউগ্লিফাইয়ের সাথে সংকলন করে থাকেন তবে এটি অ-গ্লোবাল শ্রেণীর নাম পরিবর্তন করবে। এটি প্রতিরোধ করতে, উগ্লিফাইয়ের একটি প্যারাম রয়েছে --mangleযা আপনি মিথ্যাতে সেট করতে পারেন তা হ'ল গুল্প বা গ্রান্ট ব্যবহার করে ।


6
এটি সম্ভবত হওয়া উচিত func.prototype(হ্যাঁ, ফাংশনগুলি অবজেক্টস তবে prototypeসম্পত্তি কেবলমাত্র ফাংশন অবজেক্টের ক্ষেত্রে প্রাসঙ্গিক)।
মাইলস

5
আপনি হয়ত instanceof/ isPrototypeOf()এবং অ-মানক উল্লেখ করতেও পারেন__proto__
ক্রিস্টোফ

9
ইএস Object.getPrototypeOf()
ক্রিস্টোফ

22
সতর্কতা : constructor.nameআপনার কোডটি খাটো করা হচ্ছে কিনা তার উপর নির্ভর করবেন না । ফাংশনের নাম নির্বিচারে পরিবর্তন হতে চলেছে।
igorsantos07

3
@ igorsantos07, কমপক্ষে 2019 এ; "অনলাইন জাভাস্ক্রিপ্ট মিনিফায়ার" এর শীর্ষস্থানীয় 5-10 গুগল ফলাফলগুলিকে construction.nameঅগ্রাহ্য করা / কমানোর নয় বলে টোকেন হিসাবে স্বীকৃতি দেয়। সর্বাধিক (সমস্ত না থাকলে) মিনিফায়ার সফ্টওয়্যার ব্যতিক্রমের বিধি সরবরাহ করে।
ভলকান রেভেন

296
obj.constructor.name

আধুনিক ব্রাউজারগুলির একটি নির্ভরযোগ্য পদ্ধতি। Function.nameইএস in-তে আনুষ্ঠানিকভাবে স্ট্যান্ডার্ডের সাথে যুক্ত করা হয়েছিল, এটি একটি স্ট্রিং হিসাবে জাভাস্ক্রিপ্ট অবজেক্টের "শ্রেণি" পাওয়ার একটি মান-সম্মতিযুক্ত মাধ্যম। যদি অবজেক্টটি সাথে ইনস্ট্যান্ট করা হয় তবে var obj = new MyClass()এটি "মাইক্লাস" ফিরে আসবে।

এটি সংখ্যার জন্য "সংখ্যা", অ্যারেগুলির জন্য "অ্যারে" এবং ফাংশনগুলির জন্য "ফাংশন" ফিরিয়ে দেবে It এটি সাধারণত প্রত্যাশার মতো আচরণ করে। কেবলমাত্র এটির ক্ষেত্রে ব্যর্থ হয় যদি কোনও প্রোটোটাইপ, মাধ্যমে Object.create( null ), বা কোনও বেনামে-সংজ্ঞায়িত (নামবিহীন) ফাংশন থেকে অবজেক্টটি তৈরি করা হয়।

এছাড়াও মনে রাখবেন যে আপনি যদি নিজের কোডটি খাটো করে নিচ্ছেন তবে হার্ড-কোডেড ধরণের স্ট্রিংগুলির সাথে তুলনা করা নিরাপদ নয়। পরিবর্তে উদাহরণ পরীক্ষণ যদি obj.constructor.name == "MyType", পরিবর্তে পরীক্ষা obj.constructor.name == MyType.name। অথবা কেবল কন্সট্রাক্টরদের নিজের সাথে তুলনা করুন, তবে এটি ডিওএম সীমানা জুড়ে কাজ করবে না কারণ প্রতিটি ডিওমে কনস্ট্রাক্টর ফাংশনের বিভিন্ন উদাহরণ রয়েছে, সুতরাং তাদের নির্মাণকারীগুলির সাথে কোনও বস্তুর তুলনা কাজ করবে না won't


11
Function.nameজাভাস্ক্রিপ্ট স্ট্যান্ডার্ডের (এখনও) অংশ নয়। এটি বর্তমানে ক্রোম এবং ফায়ারফক্সে সমর্থিত তবে আইই (10) এ নয়।
হালসিওন

13
obj.constructor.nameশুধুমাত্র নামযুক্ত ফাংশনগুলির জন্য কাজ করে। অর্থাত, আমি যদি সংজ্ঞায়িত var Foo = function() {}, তারপর জন্য var foo = new Foo(), foo.constructor.nameআপনি খালি স্ট্রিং দিতে হবে।
কেএফএল

29
সতর্কতা : constructor.nameআপনার কোডটি খাটো করা হচ্ছে কিনা তার উপর নির্ভর করবেন না । ফাংশনের নাম নির্বিচারে পরিবর্তন হতে চলেছে।
igorsantos07


1
@ অ্যাডালবার্টপ্লিল ইএস 6 এর আগে ম্যানুয়ালি প্রোটোটাইপগুলি শৃঙ্খলাবদ্ধ করে তোলার কাজটি ছিল। constructor.nameES6 এ নতুন শ্রেণি সমর্থন সহ প্রত্যাশার সাথে আচরণ করা জেনে রাখা ভাল ।
ডিভাইস 1

29

এই ফাংশনটি "Undefined"অপরিশোধিত মানগুলির "Null"জন্য এবং শূন্য হয়ে যায়।
অন্যান্য সমস্ত মানগুলির জন্য, CLASSNAMEপার্টটি এক্সট্রাক্ট করা হয় [object CLASSNAME]যা ব্যবহারের ফলাফল Object.prototype.toString.call(value)

function getClass(obj) {
  if (typeof obj === "undefined") return "Undefined";
  if (obj === null) return "Null";
  return Object.prototype.toString.call(obj).match(/^\[object\s(.*)\]$/)[1];
}

getClass("")   === "String";
getClass(true) === "Boolean";
getClass(0)    === "Number";
getClass([])   === "Array";
getClass({})   === "Object";
getClass(null) === "Null";
// etc...

অবজেক্ট.প্রোটোটাইপ.জেটক্লাস = ফাংশন () obj
আপত্তিটির

2
অবশ্যই তখন নাল এবং অপরিজ্ঞাত করা যাবে না কারণ কেবলমাত্র অবজেক্টটির getClass পদ্ধতি থাকবে
স্পার্ক

8
এটি কেবল নেটিভ অবজেক্টে কাজ করে। যদি আপনার কোনও ধরণের উত্তরাধিকার থাকে তবে আপনি সর্বদা পাবেন "Object"
হালসিওন

হ্যাঁ, ফাংশনের শেষ লাইনটি ঠিক হওয়া উচিত return obj.constructor.name। এটি একই ফলাফল দেয়, প্লাস অ-নেটিভ বস্তুও পরিচালনা করে।
স্টিভ বেনেট

18

"সিউডো ক্লাস" পেতে, আপনি কনস্ট্রাক্টর ফাংশনটি পেতে পারেন by

obj.constructor

অনুমান করা যে constructorআপনি উত্তরাধিকারটি করার সময় সঠিকভাবে সেট করা হয়েছে - যা এরকম কিছু দ্বারা:

Dog.prototype = new Animal();
Dog.prototype.constructor = Dog;

এবং এই দুটি লাইন একসাথে:

var woofie = new Dog()

woofie.constructorনির্দেশ করবে Dog। নোট যে Dogএকটি নির্মাণকারী ফাংশন, এবং একটি Functionঅবজেক্ট। তবে আপনি করতে পারেন if (woofie.constructor === Dog) { ... }

আপনি যদি স্ট্রিং হিসাবে ক্লাসের নাম পেতে চান তবে আমি নিম্নলিখিতটি ভালভাবে কাজ করতে পেলাম:

http://blog.magnetiq.com/post/514962277/finding-out-class-names-of-javascript-objects

function getObjectClass(obj) {
    if (obj && obj.constructor && obj.constructor.toString) {
        var arr = obj.constructor.toString().match(
            /function\s*(\w+)/);

        if (arr && arr.length == 2) {
            return arr[1];
        }
    }

    return undefined;
}

এটি কনস্ট্রাক্টর ফাংশনে যায়, এটিকে স্ট্রিংয়ে রূপান্তর করে এবং কনস্ট্রাক্টর ফাংশনটির নাম বের করে।

নোট যে obj.constructor.nameভাল কাজ করতে পারে, কিন্তু এটি মান নয়। এটি ক্রোম এবং ফায়ারফক্সে রয়েছে, তবে আইই 9 বা আইই 10 আরটিএম সহ নয় IE


13

আপনি কনস্ট্রাক্টর ফাংশনের একটি রেফারেন্স পেতে পারেন যা কনস্ট্রাক্টর প্রপার্টি ব্যবহার করে অবজেক্ট তৈরি করেছে :

function MyObject(){
}

var obj = new MyObject();
obj.constructor; // MyObject

রানটাইমের সময় আপনার যদি কোনও সামগ্রীর ধরণের বিষয়টি নিশ্চিত করতে হয় তবে আপনি উদাহরণস্বরূপ অপারেটরটি ব্যবহার করতে পারেন :

obj instanceof MyObject // true

এটি নিজেই কনস্ট্রাক্টর ফাংশনটি ফিরিয়ে দেয় না, যেমন আপনি আবার কল করতে পারেন এবং এই জাতীয় কোনও নতুন অবজেক্ট তৈরি করতে পারেন?
স্পার্ক করুন

1
@ স্পার্ক হ্যাঁ, আপনি এখনও একই ডিওমে থাকাকালীন এখনও এটি তুলনা করার জন্য ব্যবহার করতে পারেন (আপনি ফাংশন অবজেক্টের তুলনা করছেন)। তবে কনস্ট্রাক্টরকে স্ট্রিংয়ে রূপান্তর করা এবং এটির তুলনা করা আরও ভাল অনুশীলন, বিশেষত কারণ এটি আইফ্রেমেস ব্যবহার করার সময় ডোম সীমানা জুড়ে কাজ করে।
ডিভিস 1

এই উত্তরটি "শ্রেণি" প্রদান করে (বা কমপক্ষে একটি হ্যান্ডেল অবজেক্ট যা শ্রেণীর উদাহরণ তৈরি করতে ব্যবহৃত হতে পারে - যা "শ্রেণি" এর সমান)। উপরের সমস্ত উত্তরগুলি ফেরত স্ট্রিংগুলি যা "শ্রেণীর অবজেক্ট" (যেমনটি ছিল) তেমন নয়।
মাইক পি।

8

পিছনে-সামঞ্জস্যের এর অবিচ্ছিন্ন রেকর্ড, ECMAScript 6 এর সাথে তাল মিলিয়ে, জাভাস্ক্রিপ্টটিতে এখনও কোনও classপ্রকার নেই (যদিও সবাই এটি বুঝতে পারে না)। এটা তোলে করেন একটি আছে classতার অংশ হিসেবে শব্দ classএগুলির নমুনা-কিন্তু তৈরি করার জন্য সিনট্যাক্স এখনও জিনিস বর্গ নামক । জাভাস্ক্রিপ্ট এখন নেই এবং এটি কোনও ধ্রুপদী ওওপি ভাষা হয়নি । শ্রেণীর নিরিখে জেএসের কথা বলা কেবল বিভ্রান্তিমূলক বা প্রোটোটাইপিকাল উত্তরাধিকার সূচনা না করা (কেবলমাত্র এটি বাস্তব রাখা) a

এর অর্থ ফাংশনটির this.constructorএকটি রেফারেন্স পাওয়ার এখনও দুর্দান্ত উপায় constructor। এবং this.constructor.prototypeপ্রোটোটাইপ নিজেই অ্যাক্সেস করার উপায়। যেহেতু এটি জাভা নয়, এটি কোনও শ্রেণি নয়। আপনার নমুনাটি ইনস্ট্যান্ট করা হয়েছিল এটিই প্রোটোটাইপ অবজেক্ট। প্রোটোটাইপ চেইন তৈরির জন্য ES6 সিনট্যাকটিক চিনি ব্যবহার করার উদাহরণ এখানে রয়েছে:

class Foo {
  get foo () {
    console.info(this.constructor, this.constructor.name)
    return 'foo'
  }
}

class Bar extends Foo {
  get foo () {
    console.info('[THIS]', this.constructor, this.constructor.name, Object.getOwnPropertyNames(this.constructor.prototype))
    console.info('[SUPER]', super.constructor, super.constructor.name, Object.getOwnPropertyNames(super.constructor.prototype))

    return `${super.foo} + bar`
  }
}

const bar = new Bar()
console.dir(bar.foo)

এটি যা ব্যবহার করে ফলাফল babel-node:

> $ babel-node ./foo.js                                                                                                                    6.2.0 master ●]
[THIS] [Function: Bar] 'Bar' [ 'constructor', 'foo' ]
[SUPER] [Function: Foo] 'Foo' [ 'constructor', 'foo' ]
[Function: Bar] 'Bar'
'foo + bar'

সেখানে আপনি এটি আছে! ২০১ In classসালে জাভাস্ক্রিপ্টে একটি কীওয়ার্ড রয়েছে তবে এখনও শ্রেণির ধরণ নেই। this.constructorকনস্ট্রাক্টর ফাংশন this.constructor.prototypeপাওয়ার সেরা উপায়, প্রোটোটাইপ নিজেই অ্যাক্সেস পাওয়ার সর্বোত্তম উপায়।


7

আমার এখন জেনেরিক কাজ করার একটি পরিস্থিতি ছিল এবং এটি ব্যবহার করেছি:

class Test {
  // your class definition
}

nameByType = function(type){
  return type.prototype["constructor"]["name"];
};

console.log(nameByType(Test));

টাইপ ইনপুট দ্বারা ক্লাসের নামটি খুঁজে পেতে কেবলমাত্র আমি খুঁজে পেয়েছি যদি আপনার কোনও বস্তুর উদাহরণ না থাকে।

(ES2017 এ লিখিত)

ডট স্বরলিপিও ঠিক কাজ করে

console.log(Test.prototype.constructor.name); // returns "Test" 

আহ এই আমি যা খুঁজছিলাম ছিল। এটি তাত্ক্ষণিকর না হলে শ্রেণীর নাম পেতে আপনাকে 'প্রোটোটাইপ' ব্যবহার করতে হবে। অসংখ্য ধন্যবাদ!
আরতোকুন

4

ES6 এ জাভাস্ক্রিপ্ট ক্লাসের জন্য আপনি ব্যবহার করতে পারেন object.constructorgetClass()পদ্ধতির নীচের উদাহরণের শ্রেণিতে ES6 শ্রেণিটি প্রত্যাশার মতো প্রত্যাবর্তন করবে:

var Cat = class {

    meow() {

        console.log("meow!");

    }

    getClass() {

        return this.constructor;

    }

}

var fluffy = new Cat();

...

var AlsoCat = fluffy.getClass();
var ruffles = new AlsoCat();

ruffles.meow();    // "meow!"

আপনি যদি getClassপদ্ধতিটি থেকে ক্লাসটি ইনস্ট্যান্ট করেন তবে নিশ্চিত করুন যে আপনি এটি বন্ধনীতে আবদ্ধ রেখেছেন egruffles = new ( fluffy.getClass() )( args... );


3

আমি খুঁজে object.constructor.toString()আগমন [object objectClass]IE তে বদলে function objectClass () {}chome মধ্যে ফিরে আসেন। সুতরাং, আমি মনে করি http://blog.magnetiq.com/post/514962277/finding-out-class-names-of-javascript-objects এ কোডগুলি আইই তে ভাল কাজ করতে পারে না nd এবং আমি কোডটি নীচের হিসাবে ঠিক করেছি:

কোড:

var getObjectClass = function (obj) {
        if (obj && obj.constructor && obj.constructor.toString()) {

                /*
                 *  for browsers which have name property in the constructor
                 *  of the object,such as chrome 
                 */
                if(obj.constructor.name) {
                    return obj.constructor.name;
                }
                var str = obj.constructor.toString();
                /*
                 * executed if the return of object.constructor.toString() is 
                 * "[object objectClass]"
                 */

                if(str.charAt(0) == '[')
                {
                        var arr = str.match(/\[\w+\s*(\w+)\]/);
                } else {
                        /*
                         * executed if the return of object.constructor.toString() is 
                         * "function objectClass () {}"
                         * for IE Firefox
                         */
                        var arr = str.match(/function\s*(\w+)/);
                }
                if (arr && arr.length == 2) {
                            return arr[1];
                        }
          }
          return undefined; 
    };

2

জাভাস্ক্রিপ্টে কোনও ক্লাস নেই, তবে আমি মনে করি আপনি নির্মাণকারীর নাম চান এবং obj.constructor.toString()আপনাকে কী প্রয়োজন তা আপনাকে বলবেন।


1
এটি কনস্ট্রাক্টর ফাংশনের পুরো সংজ্ঞাটি স্ট্রিং হিসাবে ফিরিয়ে দেবে। আপনি কি সত্যিই চান .name
ডিভাইস 1

4
তবে .nameআইই 9
তেও

1

ডিএফএ এর সাথে সম্মত হন, এই কারণেই যখন কোনও নামী শ্রেণি পাওয়া যায় না তখন আমি প্রোটোটাকে ক্লাস হিসাবে বিবেচনা করি

আমার মানসিকতার সাথে মিল রাখতে এখানে এলি গ্রে পোস্ট করা একটির আপগ্রেড করা ফাংশন is

function what(obj){
    if(typeof(obj)==="undefined")return "undefined";
    if(obj===null)return "Null";
    var res = Object.prototype.toString.call(obj).match(/^\[object\s(.*)\]$/)[1];
    if(res==="Object"){
        res = obj.constructor.name;
        if(typeof(res)!='string' || res.length==0){
            if(obj instanceof jQuery)return "jQuery";// jQuery build stranges Objects
            if(obj instanceof Array)return "Array";// Array prototype is very sneaky
            return "Object";
        }
    }
    return res;
}

1

আপনার যদি কেবল জিইটি ক্লাসের প্রয়োজন হয় না, তবে এটির কেবল একটি উদাহরণ থাকা থেকে ব্যয় করতে চান তবে লিখুন:

আসুন

 class A{ 
   constructor(name){ 
     this.name = name
   }
 };

 const a1 = new A('hello a1');

সুতরাং এটিকে প্রসারিত করতে কেবল উদাহরণটি ব্যবহার করুন:

const a2 = new ((Object.getPrototypeOf(a)).constructor())('hello a2')
// the analog of const a2 = new A()

console.log(a2.name)//'hello a2'

0

আমি ব্যবহার করার পরামর্শ দিচ্ছি Object.prototype.constructor.name:

Object.defineProperty(Object.prototype, "getClass", {
    value: function() {
      return this.constructor.name;
    }
});

var x = new DOMParser();
console.log(x.getClass()); // `DOMParser'

var y = new Error("");
console.log(y.getClass()); // `Error'

0

এখানে একটি বাস্তবায়ন getClass() এবংgetInstance()

আপনি ব্যবহার করে কোনও অবজেক্টের ক্লাসের জন্য একটি রেফারেন্স পেতে সক্ষম হন this.constructor

একটি উদাহরণ প্রসঙ্গে:

function A() {
  this.getClass = function() {
    return this.constructor;
  }

  this.getNewInstance = function() {
    return new this.constructor;
  }
}

var a = new A();
console.log(a.getClass());  //  function A { // etc... }

// you can even:
var b = new (a.getClass());
console.log(b instanceof A); // true
var c = a.getNewInstance();
console.log(c instanceof A); // true

স্থির প্রসঙ্গ থেকে:

function A() {};

A.getClass = function() {
  return this;
}

A.getInstance() {
  return new this;
}

2
শুধু কেন নয় this.constructor?
সলোমন উকো

1
আমি জানি না, তবে এটি যদি আরও ভাল হয় তবে আপনি অবশ্যই ভাল হিসাবে উত্তরটি এটিকে সম্পাদন করতে পারেন, কারণ এটি একটি সম্প্রদায় after
ব্রুনো ফিঙ্গার

0

আপনি এই জাতীয় কিছু করতে পারেন

 class Hello {
     constructor(){
     }
    }
    
      function isClass (func) {
        return typeof func === 'function' && /^class\s/.test(Function.prototype.toString.call(func))
    }
    
   console.log(isClass(Hello))

এটি আপনাকে জানাবে ইনপুটটি শ্রেণিবদ্ধ কিনা


-2

জাভাস্ক্রিপ্ট একটি শ্রেণি-হীন ভাষা: জাভা হিসাবে যেমন শ্রেণীর আচরণ স্থিরভাবে সংজ্ঞায়িত করে এমন কোনও শ্রেণি নেই। জাভাস্ক্রিপ্ট পদ্ধতি এবং উত্তরাধিকার সহ বস্তুর বৈশিষ্ট্যগুলি সংজ্ঞায়িত করার জন্য ক্লাসের পরিবর্তে প্রোটোটাইপ ব্যবহার করে। জাভাস্ক্রিপ্টে প্রোটোটাইপগুলি সহ অনেকগুলি ক্লাস-ভিত্তিক বৈশিষ্ট্যগুলি অনুকরণ করা সম্ভব।


12
আমি প্রায়শই বলেছি যে জাভাস্ক্রিপ্টে ক্লাসের অভাব রয়েছে :)
স্টিভেন

4
আপডেট: ECMAScript 6 হিসাবে, জাভাস্ক্রিপ্টের এখনও কোনও classপ্রকার নেই। এটা তোলে করেন একটি আছে classশব্দ এবং classএগুলির নমুনা, যা পদ্ধতি আরো সহজে অ্যাক্সেস করতে পারবেন তৈরি করার জন্য সিনট্যাক্স super
james_womack

-3

প্রশ্নের জবাব ইতিমধ্যে উত্তর হয়েছে বলে মনে হচ্ছে তবে ওপি আমাদের জাভাতে যেমন করে এবং নির্বাচিত উত্তর যথেষ্ট নয় (ইমো) তেমন শ্রেণি এবং অবজেক্টের অ্যাক্সেস পেতে চায়।

নিম্নলিখিত ব্যাখ্যার সাথে আমরা কোনও বস্তুর শ্রেণি পেতে পারি (এটি আসলে জাভাস্ক্রিপ্টে প্রোটোটাইপ বলে)।

var arr = new Array('red', 'green', 'blue');
var arr2 = new Array('white', 'black', 'orange');

আপনি এই জাতীয় সম্পত্তি যুক্ত করতে পারেন:

Object.defineProperty(arr,'last', {
  get: function(){
    return this[this.length -1];
  }
});
console.log(arr.last) // blue

তবে .lastসম্পত্তি কেবল ' arr' অবজেক্টে উপলব্ধ হবে যা অ্যারে প্রোটোটাইপ থেকে ইনস্ট্যান্ট করা আছে। সুতরাং, .lastঅ্যারে প্রোটোটাইপ থেকে তাত্ক্ষণিকভাবে সমস্ত বস্তুর জন্য সম্পত্তি উপলব্ধ থাকার .lastজন্য আমাদের অ্যারে প্রোটোটাইপের জন্য সম্পত্তিটি সংজ্ঞায়িত করতে হবে :

Object.defineProperty(Array.prototype,'last', {
  get: function(){
    return this[this.length -1];
  }
});
console.log(arr.last) // blue
console.log(arr2.last) // orange

এখানে সমস্যাটি হ'ল, আপনাকে জানতে হবে কোন অবজেক্টের ধরণ (প্রোটোটাইপ) 'arr ' এবং ' arr2' ভেরিয়েবলগুলি সাথে সম্পর্কিত! অন্য কথায়, যদি আপনি ' arr' অবজেক্টের ক্লাস টাইপ (প্রোটোটাইপ) না জানেন তবে আপনি তাদের জন্য কোনও সম্পত্তি নির্ধারণ করতে পারবেন না। উপরের উদাহরণে, আমরা জানি যে অ্যারেরটি অ্যারে অবজেক্টের উদাহরণ, এজন্যই আমরা অ্যারের জন্য একটি সম্পত্তি সংজ্ঞায়িত করতে অ্যারে.প্রোটোটাইপ ব্যবহার করেছি। তবে আমরা যদি ' arr' এর ক্লাস (প্রোটোটাইপ) না জানতাম তবে কী হবে ?

Object.defineProperty(arr.__proto__,'last2', {
  get: function(){
    return this[this.length -1];
  }
});
console.log(arr.last) // blue
console.log(arr2.last) // orange

আপনি দেখতে পাচ্ছেন যে, না জেনে 'arr ' একটি অ্যারে আমরা ' arr' ব্যবহার করে ' arr.__proto__' শ্রেণীর উল্লেখ করে একটি নতুন সম্পত্তি যুক্ত করতে পারি ।

arrএটি অ্যারের উদাহরণ না জেনে আমরা ' ' এর প্রোটোটাইপটি অ্যাক্সেস করেছি এবং আমি মনে করি ওপি এটিই বলেছিল।


__proto__সম্পত্তি অবচিত, এবং উপর প্রায় কোনো সুবিধা রয়েছে prototypeসম্পত্তি।
নীলা_ব্রিক
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.