জাভাস্ক্রিপ্ট এ ইনস্ট্যান্সফর অপারেটর কি?


313

instanceofজাভাস্ক্রিপ্ট মধ্যে শব্দ বেশ বিভ্রান্তিকর যখন এটি প্রথম সম্মুখীন করা হয়, মানুষ ভাবতে জাভাস্ক্রিপ্ট একটি অবজেক্ট ওরিয়েন্টেড প্রোগ্রামিং ভাষা নয় ঝোঁক হতে পারে।

  • এটা কি?
  • এটি কোন সমস্যার সমাধান করে?
  • এটি কখন উপযুক্ত এবং কখন নয়?

3
যদিও উত্তরগুলি বেলো খুব দরকারী, আপনি সত্য শব্দ শব্দের অ্যাপ্লিকেশনগুলিতে এটি বেশি ব্যবহার করেন না (কমপক্ষে আমি না)। কেউ একটি অবজেক্ট. টাইপ সম্পত্তি তৈরি করবে যা একটি স্ট্রিং ধারণ করে এবং এটিতে পরীক্ষা করে।
ওমর আল-ইতাওয়াই

4
জেএস কোনও অর্থ দেয় না: "foo" instanceof String=> মিথ্যা, 1 instanceof Number=> মিথ্যা, {} instanceof Object=> মিথ্যা। বল কি?!
morbusg

12
@ এমবারবাস আপনার মন্তব্য বিভ্রান্তিকর। প্রথম "foo" instanceof String => falseসঠিক, কারণ typeof "foo" == 'string'new String("foo") instanceof String => true, কারণ typeof String == 'function'- আপনার ক্লাসের মতো ফাংশনটি আচরণ করা উচিত (শ্রেণির সংজ্ঞা)। আপনি যখন এটি নির্ধারণ করেন তখন পরিবর্তনশীল instanceofকিছু function(শ্রেণি) হয়ে যান var v = new AnythingWhatTypeofEqualsFunction()। একই প্রযোজ্য 1typeof 1 == 'number'- 'সংখ্যা' নয় 'ফাংশনটি' :) পরবর্তী - {} instanceof Objectহয় TRUEনোড এবং আধুনিক ব্রাউজারে
fider

1
@ ফাইডার: এটি ছিল রুবিবাদক থেকে আগত ভাষাগুলির প্রতি মন্তব্য।
morbusg

@ এমবারবাস - ({}) instanceof Objectফিরে আসবে true। আসলে আপনার লেখা কোডটি আপনাকে একটি ত্রুটি দেবে।
DDM

উত্তর:


279

উদাহরণস্বরুপ

বাম হাতের সাইড (এলএইচএস) অপরেনড হ'ল ডান হাতের সাইড (আরএইচএস) অপরেনডে পরীক্ষা করা প্রকৃত অবজেক্ট যা কোনও শ্রেণির আসল নির্মাতা। প্রাথমিক সংজ্ঞাটি হ'ল:

Checks the current object and returns true if the object
is of the specified object type.

এখানে কয়েকটি ভাল উদাহরণ রয়েছে এবং এটি মজিলার বিকাশকারী সাইট থেকে সরাসরি নেওয়া একটি উদাহরণ :

var color1 = new String("green");
color1 instanceof String; // returns true
var color2 = "coral"; //no type specified
color2 instanceof String; // returns false (color2 is not a String object)

উল্লেখযোগ্য একটি বিষয় instanceofসত্যকে মূল্যায়ন করা হয় যদি বস্তুটি ক্লাসের প্রোটোটাইপ থেকে উত্তরাধিকার সূত্রে প্রাপ্ত হয়:

var p = new Person("Jon");
p instanceof Person

যে p instanceof Personযেহেতু সত্য pথেকে উত্তরাধিকারী Person.prototype

ওপির অনুরোধ অনুযায়ী

আমি কিছু নমুনা কোড এবং একটি ব্যাখ্যা সহ একটি ছোট উদাহরণ যুক্ত করেছি।

যখন আপনি কোনও ভেরিয়েবল ঘোষণা করেন আপনি এটিকে একটি নির্দিষ্ট ধরণের দেন।

এই ক্ষেত্রে:

int i;
float f;
Customer c;

উপরে আপনি কিছু ভেরিয়েবল দেন, যথা i, fএবং c। ধরনের হয় integer, floatএবং একটি ব্যবহারকারীর সংজ্ঞায়িত Customerডাটা টাইপ। উপরের মতো প্রকারভেদ কেবল জাভাস্ক্রিপ্ট নয়, যে কোনও ভাষার জন্য হতে পারে। যাইহোক, জাভাস্ক্রিপ্টের সাহায্যে আপনি যখন কোনও ভেরিয়েবল ঘোষণা করেন আপনি স্পষ্টভাবে কোনও প্রকারের সংজ্ঞা দেন না var x, x একটি সংখ্যা / স্ট্রিং / কোনও ব্যবহারকারী সংজ্ঞায়িত ডেটা টাইপ হতে পারে। সুতরাং এটি কী instanceofকরে এটি এটি যা নির্দিষ্টভাবে প্রযোজ্য তা হ'ল এটি পরীক্ষা করে দেখার জন্য এটি উপরে থেকে Customerআমরা যে বস্তুটি করতে পারি তা গ্রহণ করে :

var c = new Customer();
c instanceof Customer; //Returns true as c is just a customer
c instanceof String; //Returns false as c is not a string, it's a customer silly!

উপরে আমরা দেখেছি যে cপ্রকারটি দিয়ে ঘোষিত হয়েছিল Customer। আমরা এটি নতুন করে দিয়েছি এবং এটি টাইপ করা হয়েছে কিনা তা যাচাই করেছি Customer। অবশ্যই, এটি সত্য ফিরে আসে। তারপরেও Customerঅবজেক্টটি ব্যবহার করে আমরা এটি পরীক্ষা করি কিনা String। নাহ, অবশ্যই Stringআমরা কোনও Customerবস্তুকে নয়, একটি নতুন Stringবস্তু তৈরি করেছি। এই ক্ষেত্রে, এটি মিথ্যা প্রত্যাবর্তন করে।

এটা সত্যিই যে সহজ!


@ অ্যালন - আমি আপনার জন্য একটি উদাহরণ যুক্ত করেছি। উপরে দেখুন, color1 টাইপ স্ট্রিং এর, তাই আপনি যখন বলবেন color1 instanceof String;এটি সত্য হবে কারণ রঙ 1 একটি স্ট্রিং।
জোনএইচ

@ অ্যালোন - এটি কোন ধরণের বস্তু তা দেখতে কোনও বস্তু পরীক্ষা করে। কোনও ব্যক্তি / গ্রাহক বিষয় বিবেচনা করুন। সুতরাং person p = new person()পি এখন একটি ব্যক্তি টাইপ এবং একটি স্ট্রিং টাইপ নয়।
জোনএইচ

জাভাস্ক্রিপ্টে, এটি বুঝতে অসুবিধা হতে পারে যে একটি চলকটির পুরো জীবনকাল ধরে আলাদা ধরণের স্বচ্ছলতা থাকে। কোড উদাহরণ: jsfiddle.net/sikusikucom/znSPv
moey

@ সিকু- সিকু.কম - আমি এর কোনও কৌশল দেখছি না var zero = 0; alert(zero); zero = "0"; alert(zero)আমরা কোনও সমস্যা ছাড়াই আদিম থেকে আদিম intদিকে চলে গিয়েছিলাম string
জোনএইচ

ওহ, আমি বোঝানো এটি চতুর / নতুন ছিল বুঝতে (না না ) যে "নমনীয়তা" জাভাস্ক্রিপ্ট মধ্যে, ESP। এমন কিছু ভাষার ক্ষেত্রে যারা অভ্যস্ত হয় যার উদাহরণস্বরূপ একটি চলক ধরণের পরিবর্তন করতে সুস্পষ্ট কাস্টিং প্রয়োজন। যেমনটি আপনি উল্লেখ করেছেন, প্রকারটি আদিম intথেকে আদিমতে পরিবর্তন করা খুব সহজ string
মোয়ে

95

উদাহরণস্বরূপ একটি গুরুত্বপূর্ণ দিক রয়েছে যা এখন পর্যন্ত কোনও মন্তব্যে আবৃত বলে মনে হচ্ছে না: উত্তরাধিকার। উদাহরণস্বরূপ ব্যবহারের দ্বারা মূল্যবোধ করা একটি পরিবর্তনশীল প্রোটোটাইপাল উত্তরাধিকারের কারণে একাধিক "প্রকার "গুলির জন্য সত্য ফিরে আসতে পারে।

উদাহরণস্বরূপ, আসুন একটি প্রকার এবং একটি উপপ্রকার সংজ্ঞা দিন:

function Foo(){ //a Foo constructor
    //assign some props
    return this;
}

function SubFoo(){ //a SubFoo constructor
    Foo.call( this ); //inherit static props
    //assign some new props
    return this;
}

SubFoo.prototype = Object.create(Foo.prototype); // Inherit prototype
SubFoo.prototype.constructor = SubFoo;

এখন আমাদের কাছে বেশ কয়েকটি "ক্লাস" রয়েছে যা কিছু দৃষ্টান্ত তৈরি করতে দেয় এবং সেগুলির উদাহরণগুলি কী তা খুঁজে বের করে:

var 
    foo = new Foo()
,   subfoo = new SubFoo()
;

alert( 
    "Q: Is foo an instance of Foo? "
+   "A: " + ( foo instanceof Foo ) 
); // -> true

alert( 
    "Q: Is foo an instance of SubFoo? " 
+   "A: " + ( foo instanceof SubFoo ) 
); // -> false

alert( 
    "Q: Is subfoo an instance of Foo? "
+   "A: " + ( subfoo instanceof Foo ) 
); // -> true

alert( 
    "Q: Is subfoo an instance of SubFoo? "
+   "A: " + ( subfoo instanceof SubFoo ) 
); // -> true

alert( 
    "Q: Is subfoo an instance of Object? "
+   "A: " + ( subfoo instanceof Object ) 
); // -> true

শেষ লাইনটি দেখুন? কোনও ফাংশনে সমস্ত "নতুন" কলগুলি অবজেক্ট থেকে উত্তরাধিকারসূত্রে প্রাপ্ত একটি বস্তু ফেরত দেয়। বস্তু তৈরির শর্টহ্যান্ড ব্যবহার করার পরেও এটি সত্য holds

alert( 
    "Q: Is {} an instance of Object? "
+   "A: " + ( {} instanceof Object ) 
); // -> true

এবং তাদের "ক্লাস" সংজ্ঞাগুলি কী হবে? তারা উদাহরণস্বরূপ কি?

alert( 
    "Q: Is Foo an instance of Object? "
+   "A:" + ( Foo instanceof Object) 
); // -> true

alert( 
    "Q: Is Foo an instance of Function? "
+   "A:" + ( Foo instanceof Function) 
); // -> true

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

এটিও গুরুত্বপূর্ণ যদি আপনি কোনও উত্তরাধিকারের নিদর্শন ব্যবহার করে থাকেন এবং হাঁসের টাইপিং বাদে অন্য পদ্ধতি দ্বারা কোনও বস্তুর বংশধরদের নিশ্চিত করতে চান।

আশা করি যে কাউকে অন্বেষণ করতে সহায়তা করে instanceof


আরও ভয়ঙ্কর বিষয়টি হ'ল প্রোটোটাইপটি উত্তরাধিকার সূত্রে প্রাপ্ত হওয়ার পরে আপনি এতে SubFoo.prototype = new Foo();আরও কিছু পদ্ধতি যুক্ত করতে পারেন, এবং subfoo instanceof Fooচেকটি subfoo instanceof SubFoo
Cory ড্যানিয়েলসন

87

এখানে অন্যান্য উত্তরগুলি সঠিক, তবে তারা instanceofবাস্তবে কীভাবে কাজ করে তা নিয়ে যায় না , যা কিছু ভাষার আইনজীবীর পক্ষে আগ্রহী হতে পারে।

জাভাস্ক্রিপ্টের প্রতিটি বস্তুর একটি প্রোটোটাইপ রয়েছে, যা __proto__সম্পত্তির মাধ্যমে অ্যাক্সেসযোগ্য । ফাংশনগুলিরও একটি prototypeসম্পত্তি থাকে যা __proto__তাদের তৈরি কোনও বস্তুর জন্য প্রাথমিক । একটি ফাংশন তৈরি করা হয়, এটি জন্য একটি অনন্য বস্তু দেওয়া হয় prototypeinstanceofঅপারেটর আপনি একটি উত্তর দিতে এই স্বতন্ত্রতা ব্যবহার করে। instanceofআপনি যদি এটি কোনও ফাংশন হিসাবে লিখেন তবে দেখতে দেখতে কী দেখতে পারে তা এখানে ।

function instance_of(V, F) {
  var O = F.prototype;
  V = V.__proto__;
  while (true) {
    if (V === null)
      return false;
    if (O === V)
      return true;
    V = V.__proto__;
  }
}

এটি মূলত ইসিএমএ-262 সংস্করণ 5.1 (ইএস 5 নামেও পরিচিত), বিভাগ 15.3.5.3 অনুচ্ছেদে প্যারাফ্রেস করছে।

নোট করুন যে কোনও ফাংশনের prototypeসম্পত্তিতে আপনি যে কোনও বস্তু পুনর্নির্দিষ্ট করতে পারবেন এবং কোনও অবজেক্টের __proto__সম্পত্তিটি এটি নির্মাণের পরে পুনরায় অর্পণ করতে পারেন । এটি আপনাকে কিছু আকর্ষণীয় ফলাফল দেবে:

function F() { }
function G() { }
var p = {};
F.prototype = p;
G.prototype = p;
var f = new F();
var g = new G();

f instanceof F;   // returns true
f instanceof G;   // returns true
g instanceof F;   // returns true
g instanceof G;   // returns true

F.prototype = {};
f instanceof F;   // returns false
g.__proto__ = {};
g instanceof G;   // returns false

5
এটি লক্ষণীয় যে আইইতে " __proto__" সম্পত্তির প্রত্যক্ষ ম্যানিপুলেশন অনুমোদিত নয়। যদি আমি সঠিকভাবে স্মরণ করি তবে সম্পত্তিটির সরাসরি হেরফেরটি ইসিএমএ অনুচ্ছেদে অন্তর্ভুক্ত নয় তাই এটি একাডেমিক অনুসারী ব্যতীত অন্য কোনও কার্যভারের জন্য ব্যবহার করা সম্ভবত একটি খারাপ ধারণা।
ওয়েবনেস্টো

@ ওয়েবেনেস্তো, ​​এটি সত্য, প্রোটো অনুমানের মধ্যে নেই। আমি জানতাম না যদিও IE এটি সমর্থন করে না। আপনি যখন সরাসরি হেরফের বলছেন, আপনি কি বোঝাতে চেয়েছেন এটি মোটেও জেএস কোডের সাথে প্রকাশিত হয়নি, বা এটি কেবল লেখার যোগ্য নয়?
জে কনরোড

2
পুরানো সংস্করণগুলিতে 100% নিশ্চিত নয়। এখান থেকে মনে হচ্ছে ( স্ট্যাকওভারফ্লো / প্রশ্ন / 84৪১13০৫৫ / প্রপোটো-ফর-ie9-or-ie10 ) যে আই 99 এ এটি কমপক্ষে পঠনযোগ্য (যদিও পরিবর্তনীয় নয়)। এও লক্ষণীয় যে ব্রাউজারগুলি এটিকে পুরোপুরি বাদ দিচ্ছে বলে মনে হচ্ছে।
ওয়েবনেস্টো

4
প্রোটোর সম্পত্তিটির অন্তর্নিহিত অস্তিত্ব বোঝা তা ব্যবহারকারীর কোডে অ্যাক্সেসযোগ্য কিনা তা গুরুত্বপূর্ণ। +10 যদি আমি অনুমানের উদ্ধৃতি দিতে পারি, এটি ঠিক এখানে যা আমি এখানে এসেছি।
মাইক এডওয়ার্ডস

3
প্রোটোটাইপ লিঙ্কটি পেতে, ব্যবহার করুন Object.getPrototypeOf(o), এটি __proto__আপনি বর্ণিত হিসাবে একই হবে , তবে ইসসিএমএসক্রিপ্ট অনুসারে।
শে

45

আমি মনে করি এটি লক্ষ্য করার মতো বিষয় যে অবজেক্টটি ঘোষণার সময় উদাহরণস্বরূপ "নতুন" কীওয়ার্ড ব্যবহার করে সংজ্ঞায়িত করা হয়। জোনএইচের উদাহরণে;

var color1 = new String("green");
color1 instanceof String; // returns true
var color2 = "coral";
color2 instanceof String; // returns false (color2 is not a String object)

তিনি যা উল্লেখ করেননি তা হ'ল;

var color1 = String("green");
color1 instanceof String; // returns false

"নতুন" সুনির্দিষ্ট করে স্ট্রিং কনস্ট্রাক্টর ফাংশনটির শেষের অবস্থাটি কেবল রঙিন ভেরিতে কালার 1 ভারে অনুলিপি করা হয়েছে, কেবল এটির ফেরতের মানটিতে সেট করার চেয়ে। আমি মনে করি এটি নতুন কীওয়ার্ডটি কী করে তা আরও ভাল দেখায়;

function Test(name){
    this.test = function(){
        return 'This will only work through the "new" keyword.';
    }
    return name;
}

var test = new Test('test');
test.test(); // returns 'This will only work through the "new" keyword.'
test // returns the instance object of the Test() function.

var test = Test('test');
test.test(); // throws TypeError: Object #<Test> has no method 'test'
test // returns 'test'

"নতুন" ব্যবহারের ফলে ঘোষিত ভেরিয়াকে ফাংশনের ভিতরে "এই" এর মান নির্ধারিত হয়, এটি ব্যবহার না করে পরিবর্তে ফেরতের মান নির্ধারণ করে।


2
newজাভাস্ক্রিপ্টের যে কোনও প্রকারের সাথে এটি ব্যবহার করা বোধগম্য নয় যা গ্রহণযোগ্য উত্তরটি প্রাথমিকভাবে আরও বিভ্রান্তিকর করে তোলে। text = String('test')এবং পরিবর্তে পরিবর্তে , বরং options = {}পরীক্ষা করা হচ্ছে না । instanceoftypeof
রায়ান

3
তারিখ.সেটটাইম () // ব্যর্থ। হ্যাঁ, নতুন গুরুত্বপূর্ণ।
স্টিফেন বেলঞ্জার

1
এটি কনসোলে চালানোর চেষ্টা করুন। আপনি একটি ত্রুটি পাবেন কারণ গেটটাইম () উপস্থিত নেই। আপনার নতুন ব্যবহার করা দরকার।
স্টিফেন বেলঞ্জার

8

এবং আপনি এটির মতো ত্রুটি পরিচালনা ও ডিবাগিংয়ের জন্য এটি ব্যবহার করতে পারেন:

try{
    somefunction();
} 
catch(error){
    if (error instanceof TypeError) {
        // Handle type Error
    } else if (error instanceof ReferenceError) {
        // Handle ReferenceError
    } else {
        // Handle all other error types
    }
}

3
//Vehicle is a function. But by naming conventions
//(first letter is uppercase), it is also an object
//constructor function ("class").
function Vehicle(numWheels) {
    this.numWheels = numWheels;
}

//We can create new instances and check their types.
myRoadster = new Vehicle(4);
alert(myRoadster instanceof Vehicle);

3

এটা কি?

জাভাস্ক্রিপ্ট একটি প্রোটোটাইপাল ভাষা যার অর্থ এটি 'উত্তরাধিকারের' জন্য প্রোটোটাইপ ব্যবহার করে। instanceofএকটি কন্সট্রাকটর ফাংশনের অপারেটর পরীক্ষা prototypepropertype উপস্থিত __proto__একটি বস্তুর শিকল। এর অর্থ এই যে এটি নিম্নলিখিতগুলি করবে (ধরে নিবেন যে টেস্টওবিজ একটি ফাংশন অবজেক্ট):

obj instanceof testObj;
  1. অবজেক্টের প্রোটোটাইপ কনস্ট্রাক্টরের প্রোটোটাইপের সমান কিনা তা পরীক্ষা করুন: obj.__proto__ === testObj.prototype >> এটি true instanceofযদি ফিরে আসেtrue
  2. প্রোটোটাইপ চেইন উপরে উঠবে। উদাহরণস্বরূপ: obj.__proto__.__proto__ === testObj.prototype >> এটি হলে true instanceofফিরে আসবেtrue
  3. অবজেক্টের সম্পূর্ণ প্রোটোটাইপ পরীক্ষা না করা পর্যন্ত পদক্ষেপ 2 পুনরাবৃত্তি করবে। যদি না কোথাও অবজেক্টটির প্রোটোটাইপ চেইনের সাথে মিল থাকে testObj.prototypeতবে instanceofঅপারেটর ফিরে আসবে false

উদাহরণ:

function Person(name) {
  this.name = name;
}
var me = new Person('Willem');

console.log(me instanceof Person); // true
// because:  me.__proto__ === Person.prototype  // evaluates true

console.log(me instanceof Object); // true
// because:  me.__proto__.__proto__ === Object.prototype  // evaluates true

console.log(me instanceof Array);  // false
// because: Array is nowhere on the prototype chain

এটি কোন সমস্যার সমাধান করে?

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

উদাহরণ:

function Person1 (name) {
  this.name = name;
}

function Person2 (name) {
  this.name = name;
}

Person1.prototype.talkP1 = function () {
  console.log('Person 1 talking');
}

Person2.prototype.talkP2 = function () {
  console.log('Person 2 talking');
}


function talk (person) {
  if (person instanceof Person1) {
    person.talkP1();
  }
  
  if (person instanceof Person2) {
    person.talkP2();
  }
  
  
}

const pers1 = new Person1 ('p1');
const pers2 = new Person2 ('p2');

talk(pers1);
talk(pers2);

এখানে talk()ফাংশনটিতে প্রথমে প্রোটোটাইপটি অবজেক্টে অবস্থিত কিনা তা পরীক্ষা করা হয়। এর পরে কার্যকর পদ্ধতিটি কার্যকর করতে বাছাই করা হয়। এই চেকটি না করার ফলে এমন একটি পদ্ধতি কার্যকর করা যেতে পারে যা বিদ্যমান নেই এবং সুতরাং একটি রেফারেন্স ত্রুটি।

এটি কখন উপযুক্ত এবং কখন নয়?

আমরা ধরনের ইতিমধ্যে এটি পেরেছি। যখন কোনও জিনিসের সাথে কিছু করার আগে আপনার প্রোটোটাইপ পরীক্ষা করার প্রয়োজন হয় তখন এটি ব্যবহার করুন।


1
আমি তোমাকে কিছু আর লিখতে "চেয়ে চেয়েছিলেন মনে একটি কন্সট্রাকটর ফাংশনের প্রোটোটাইপ একটি কন্সট্রাকটর এর প্রোটোটাইপ সম্পত্তি কোথাও প্রদর্শিত হবে "
Bergi

আপনি উল্লেখ করতে চাইতে পারেন যে ব্যক্তিদের একটি ইন্টারফেস ভাগ করে নেওয়া এবং এই দুটি পদ্ধতির নামকরণ করা আরও উপযুক্ত হবে PersonX.prototype.talk, যাতে talkফাংশনটি সহজভাবে করতে পারে person.talk()
বার্গি

আপনি এটি সম্পূর্ণরূপে আপডেট করেছেন, সুতরাং সংজ্ঞাটি আরও ভাল। নির্দেশ করার জন্য ধন্যবাদ!
উইলেম ভ্যান ডার ভীন

এছাড়াও, __proto__ডকুমেন্টেশনে ব্যবহার করবেন না , এটি Object.getPrototype()
অবহেলা করা

1

"এটি কখন উপযুক্ত এবং কখন নয়?" প্রশ্নে আমার 2 সেন্ট:

instanceofপ্রোডাকশন কোডে খুব কমই কার্যকর, তবে পরীক্ষাগুলিতে কার্যকর যেখানে আপনি দাবি করতে চান যে আপনার কোডটি সঠিক ধরণের অবজেক্টগুলি তৈরি করে / তৈরি করে। আপনার কোডটি যে ধরণের অবজেক্টগুলিতে ফিরছে / তৈরি করছে সে সম্পর্কে স্পষ্ট করে আপনার পরীক্ষাগুলি আপনার কোড বোঝার এবং ডকুমেন্ট করার সরঞ্জাম হিসাবে আরও শক্তিশালী হয়ে ওঠে।


1

instanceofকেবল সিনট্যাকটিক চিনির জন্য isPrototypeOf:

function Ctor() {}
var o = new Ctor();

o instanceof Ctor; // true
Ctor.prototype.isPrototypeOf(o); // true

o instanceof Ctor === Ctor.prototype.isPrototypeOf(o); // equivalent

instanceof কেবল কোনও অবজেক্টের কনস্ট্রাক্টরের প্রোটোটাইপের উপর নির্ভর করে।

একটি কনস্ট্রাক্টর কেবল একটি সাধারণ ফাংশন। কড়া কথায় বলতে গেলে এটি একটি ফাংশন অবজেক্ট, যেহেতু সব কিছুই জাভাস্ক্রিপ্টে একটি বস্তু। এবং এই ফাংশন অবজেক্টটির একটি প্রোটোটাইপ রয়েছে কারণ প্রতিটি ফাংশনে একটি প্রোটোটাইপ থাকে।

একটি প্রোটোটাইপ হ'ল একটি সাধারণ অবজেক্ট, যা অন্য অবজেক্টের প্রোটোটাইপ চেইনের মধ্যে অবস্থিত। এর অর্থ অন্য বস্তুর প্রোটোটাইপ শৃঙ্খলে থাকা কোনও বিষয়টিকে প্রোটোটাইপে পরিণত করে:

function f() {} //  ordinary function
var o = {}, // ordinary object
 p;

f.prototype = o; // oops, o is a prototype now
p = new f(); // oops, f is a constructor now

o.isPrototypeOf(p); // true
p instanceof f; // true

instanceofঅপারেটর এড়িয়ে চলা উচিত, কারণ এটি ক্লাস, যা JavaScript মধ্যে উপস্থিত না থাকার fakes। classES2015 তে মূল শব্দটি সত্ত্বেও নেই , যেহেতু classআবার কেবল সিনট্যাকটিক চিনির জন্য ... তবে এটি অন্য গল্প।


1
প্রথম লাইনটি ভুল! আরও তথ্যের জন্য এখানে দেখুন: "isProotypeOf () উদাহরণস্বরূপ অপারেটর থেকে পৃথক।
ইয়ান ফটো

1
@ ইয়ান এবং এখনও instanceofথেকে প্রাপ্ত isPrototypeOf। আমি এই সিনট্যাকটিক চিনি কল। এবং আপনার এমডিএন উত্স একটি রসিকতা, তাই না?

না, এটি একটি রসিকতা হওয়ার কথা নয় এবং এটি হওয়ার কথা ছিল না, তবে এখনও ভুল লিঙ্ক। আমি এই পোস্ট করা উচিত ছিল। আমি প্রযুক্তিগত দিকে যেতে চাই না, তবে একই জিনিসটি করি instanceof নাisPrototypeOf । এটাই.
ইয়ান ফটো

0

আমি সবেমাত্র একটি বাস্তব-বিশ্বের অ্যাপ্লিকেশন পেয়েছি এবং এটি এখন প্রায়শই ব্যবহার করব, আমার ধারণা।

আপনি যদি jQuery ইভেন্টগুলি ব্যবহার করেন, কখনও কখনও আপনি আরও জেনেরিক ফাংশন লিখতে চান যা সরাসরি ডাকাও যেতে পারে (ইভেন্ট ছাড়াই)। instanceofআপনার ফাংশনের প্রথম প্যারামিটারের উদাহরণ রয়েছে কিনা তা পরীক্ষা করে আপনি jQuery.Eventযথাযথভাবে প্রতিক্রিয়া জানাতে পারেন।

var myFunction = function (el) {                
    if (el instanceof $.Event) 
        // event specific code
    else
        // generic code
};

$('button').click(recalc);    // Will execute event specific code
recalc('myParameter');  // Will execute generic code

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

var recalc = function (el) { 
    el = (el == undefined || el instanceof $.Event) ? $('span.allItems') : $(el);
    // calculate...
};
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.