जावास्क्रिप्ट में Instof ऑपरेटर क्या है?


313

instanceofजावास्क्रिप्ट में कीवर्ड काफी भ्रमित जब वह पहली बार सामना करना पड़ा है, के रूप में लोगों को लगता है कि जावास्क्रिप्ट एक वस्तु उन्मुख प्रोग्रामिंग भाषा नहीं है करते हैं हो सकता है।

  • यह क्या है?
  • यह किन समस्याओं का समाधान करता है?
  • यह कब उचित है और कब नहीं?

3
यद्यपि उत्तर बलो बहुत उपयोगी होते हैं, आप वास्तविक शब्द अनुप्रयोगों में इसका उपयोग नहीं करते हैं (कम से कम मैं नहीं)। कोई एक ऑब्जेक्ट। टाइप गुण बनाता है जो एक स्ट्रिंग रखता है और उस पर जांच करता है।
उमर अल-इतावली

4
जेएस को इससे कोई मतलब नहीं है: "foo" instanceof String=> असत्य, 1 instanceof Number=> असत्य, {} instanceof Object=> असत्य। क्या कहना?!
मोरबसग

12
@morbusg आपकी टिप्पणी भ्रामक है। सबसे पहले "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

@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वस्तु newed । इस मामले में, यह गलत है।

वास्तव में यह उतना आसान है!


@ एलॉन - मैंने आपके लिए एक उदाहरण जोड़ा। ऊपर देखें, color1 टाइप स्ट्रिंग का है, इसलिए जब आप कहते हैं कि color1 instanceof String;यह सच हो जाएगा क्योंकि color1 एक स्ट्रिंग है।
जॉन एचएच

@ एलॉन - यह देखने के लिए एक वस्तु की जाँच करता है कि यह किस प्रकार की वस्तु है। किसी व्यक्ति / ग्राहक वस्तु पर विचार करें। तो person p = new person()पी अब एक व्यक्ति प्रकार है और एक स्ट्रिंग प्रकार नहीं है।
जोन्ह

जावास्क्रिप्ट में, यह समझना मुश्किल हो सकता है कि एक चर में पूरे जीवन काल में एक अलग प्रकार का लचीलापन है। कोड उदाहरण: jsfiddle.net/sikusikucom/znSPv
moey

@ Siku-Siku.Com - मुझे इसमें कोई ट्रिक नहीं दिख रही है, var zero = 0; alert(zero); zero = "0"; alert(zero)हम बिना किसी मुद्दे के intएक आदिम से एक आदिम में चले गए string
जोन्ह

ओह, मैं मतलब है कि यह मुश्किल / नई करने के लिए था समझ में (नहीं करते ) कि "लचीलापन" जावास्क्रिप्ट में, esp। कुछ के लिए जो एक भाषा के लिए उपयोग किए जाते हैं, उदाहरण के लिए एक चर प्रकार को बदलने के लिए स्पष्ट कास्टिंग की आवश्यकता होती है। जैसा कि आपने बताया, उदाहरण के लिए आदिम intसे आदिम में बदलना बहुत आसान हैstring
moey

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

वह अंतिम पंक्ति देखें? फ़ंक्शन के सभी "नए" कॉल एक ऑब्जेक्ट को वापस करते हैं जो ऑब्जेक्ट से विरासत में मिला है। वस्तु निर्माण शॉर्टहैंड का उपयोग करते समय भी यह सही है:

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

मुझे लगता है कि यह समझना कि कोई भी वस्तु MULTIPLE प्रकार का उदाहरण हो सकती है महत्वपूर्ण है, क्योंकि आप मेरी (गलत तरीके से) धारणा है कि आप के बीच अंतर कर सकते हैं, कहते हैं और ऑब्जेक्ट और एक फ़ंक्शन का उपयोग करके instanceof। यह पिछले उदाहरण के रूप में स्पष्ट रूप से पता चलता है एक समारोह है एक वस्तु।

यह भी महत्वपूर्ण है यदि आप किसी भी वंशानुक्रम पैटर्न का उपयोग कर रहे हैं और बतख-टाइपिंग के अलावा अन्य तरीकों से किसी वस्तु की संतान की पुष्टि करना चाहते हैं।

आशा है कि किसी को भी खोज में मदद करता है instanceof


इससे भी अधिक भयानक यह है कि आपके द्वारा प्रोटोटाइप से वार किए जाने के बाद आप SubFoo.prototype = new Foo();इसमें और अधिक विधियाँ जोड़ सकते हैं, और subfoo instanceof Fooचेक अभी भी पास होगाsubfoo instanceof SubFoo
Cory Danielson

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__;
  }
}

यह मूल रूप से ECMA-262 संस्करण 5.1 (जिसे ES5 के रूप में भी जाना जाता है), धारा 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 में " " संपत्ति के प्रत्यक्ष हेरफेर की अनुमति नहीं है। यदि मुझे सही ढंग से याद है, तो संपत्ति का प्रत्यक्ष हेरफेर ईसीएमए की कल्पना में शामिल नहीं है, इसलिए यह संभवतः अकादमिक गतिविधियों के अलावा अन्य असाइनमेंट के लिए इसका उपयोग करने के लिए एक बुरा विचार है।
वेबनेस्टो

@webnesto, यह सच है, प्रोटो युक्ति में नहीं है। मुझे नहीं पता था कि IE ने इसका समर्थन नहीं किया था। जब आप प्रत्यक्ष हेरफेर कहते हैं, तो क्या इसका मतलब यह है कि यह जेएस कोड से बिल्कुल भी परिचित नहीं है, या यह सिर्फ लिखने योग्य नहीं है?
जे कॉनरोड

2
पुराने संस्करणों पर 100% निश्चित नहीं है। यहाँ से लगता है ( stackoverflow.com/questions/8413505/proto-for-ie9-or-ie10 ) कि IE9 में यह कम से कम पठनीय है (हालांकि परस्पर नहीं)। यह भी उल्लेखनीय है कि ऐसा लगता है कि ब्राउज़र इसे पूरी तरह से छोड़ सकते हैं।
webnesto

4
प्रोटो संपत्ति के निहित अस्तित्व को समझना महत्वपूर्ण है कि क्या यह उपयोगकर्ता कोड तक पहुंच योग्य है या नहीं। +10 अगर मैं युक्ति का हवाला दे सकता हूं, तो ठीक यही है जो मैं यहां खोज रहा था।
माइक एडवर्ड्स

3
प्रोटोटाइप लिंक प्राप्त करने के लिए, उपयोग करें Object.getPrototypeOf(o), यह वही होगा जो __proto__आप वर्णन करते हैं, लेकिन ECMAScript के अनुरूप है।
फ्रिगिनवासियन

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

"नया" निर्दिष्ट करना वास्तव में स्ट्रिंग निर्माता फ़ंक्शन के अंतिम स्थिति को color1 var में कॉपी करता है, बजाय इसे रिटर्न वैल्यू पर सेट करने के। मुझे लगता है कि यह बेहतर दिखाता है कि नया कीवर्ड क्या करता है;

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
Date.getTime () // असफल। हां, नया महत्वपूर्ण है।
स्टीफन बेलांगर

1
कंसोल में चलाकर देखें। आपको एक त्रुटि मिलेगी क्योंकि getTime () मौजूद नहीं है। आपको नए का उपयोग करने की आवश्यकता है।
स्टीफन बेलांगर

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__एक वस्तु की श्रृंखला। इसका मतलब यह है कि यह निम्नलिखित होगा (यह मानते हुए कि testObj एक फ़ंक्शन ऑब्जेक्ट है):

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
मुझे लगता है कि आप कुछ और लिखना चाहते थे " एक निर्माण कार्य का प्रोटोटाइप एक निर्माणकर्ता की प्रोटोटाइप संपत्ति में कहीं दिखाई देता है "
बर्गी

आप यह उल्लेख करना चाहते हैं कि व्यक्तियों को एक इंटरफ़ेस साझा करना और उन दोनों तरीकों को नाम देना अधिक उपयुक्त होगा 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ऑपरेटर से बचा जाना चाहिए, क्योंकि यह कक्षाएं, जो जावास्क्रिप्ट में मौजूद नहीं है नकली। classES2015 में कीवर्ड के बावजूद या तो नहीं है, क्योंकि classफिर से सिर्फ चीनी के लिए है ... लेकिन यह एक और कहानी है।


1
बहुत पहली पंक्ति गलत है! अधिक के लिए यहाँ देखें : ".PrototypOf () Instof ऑपरेटर से भिन्न है। अभिव्यक्ति" ऑब्जेक्ट इंस्टोफ़ एफ़ंक्शन "में, ऑब्जेक्ट प्रोटोटाइप चेन को AFunction.prototype के विरुद्ध चेक किया जाता है, एफ़ंक्शन के ख़िलाफ़ नहीं।"
यान फोटो

1
@ यन और अभी भी instanceofसे लिया गया है isPrototypeOf। मैं इस संश्लिष्ट चीनी को बुलाता हूं। और आपका MDN स्रोत एक मजाक है, है ना?

नहीं। यह मजाक नहीं माना जाता था, लेकिन फिर भी गलत लिंक है। मैं इस एक पोस्ट करने के लिए था । मैं तकनीकीताओं में नहीं आना चाहता, लेकिन 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...
};
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.