2012-04-01 5 views
7
function bb_graphics_GraphicsContext(){ 
    Object.call(this); 
    this.bbdevice=null; 
    this.bbmatrixSp=0; 
    this.bbix=1.000000; 
    this.bbiy=0; 
    this.bbjx=0; 
    this.bbjy=1.000000; 
    this.bbtx=0; 
    this.bbty=0; 
    this.bbtformed=0; 
    this.bbmatDirty=0; 
    this.bbcolor_r=0; 
    this.bbcolor_g=0; 
    this.bbcolor_b=0; 
    this.bbalpha=0; 
    this.bbblend=0; 
    this.bbscissor_x=0; 
    this.bbscissor_y=0; 
    this.bbscissor_width=0; 
    this.bbscissor_height=0; 
    this.bbmatrixStack=new_number_array(192); 
} 

Object.call(this) का क्या अर्थ है?"ऑब्जेक्ट.call" का क्या अर्थ है?

+1

आप यह स्पष्ट करना चाहते हैं कि आप सोच रहे हैं कि विशेष रूप से एक निर्माता (यह "bb_graphics_GraphicsContext" फ़ंक्शन) अपने स्वयं के 'संदर्भ' संदर्भ के साथ ऐसा क्यों करेगा। – Pointy

+0

इसे कन्स्ट्रक्टर माना जाता था। लेकिन अगर ऐसा है, तो फ़ंक्शन के बाहर कॉल करना होगा। – miqbal

+0

मेरे उत्तर के अंत में यह अतिरिक्त जानकारी शामिल है कि यह क्या करता है, और यह क्यों किया जाता है कि यह क्यों किया जाता है। –

उत्तर

-1

प्रत्येक जावास्क्रिप्ट फ़ंक्शन में toString(), call() और apply() है।

उनके बारे में और अधिक पढ़ें पर JavaScript में this odetocode.com article

+1

मुझे पता है कि। मैं जानना चाहता हूं कि इस संदर्भ में क्या होता है। यह कीवर्ड क्या संदर्भित करता है ?? उस कॉल के बाद क्या होता है - Object.call (यह); – DrStrangeLove

+0

यह एक पुनरावर्ती समारोह में बदल जाता है। – miqbal

+0

@miqbal उह ... क्या? यह किसी भी पुनरावर्ती समारोह में नहीं बदलता है; इसका क्या मतलब होगा? – Pointy

9

कार्य पूर्ण वस्तुएं हैं। वे, जब किसी अन्य कार्य के लिए तर्क के रूप में पारित होते हैं, तो उनके दायरे को बरकरार न रखें। तो, निम्नलिखित कोड में ...

var obj1 = { 
    property1: "blah", 
    method1: function() { 
     alert(this.property1); 
     // do stuff 
    } 
}; 

function func1 (passedFunction) { 
    passedFunction(); 
    // do other stuff 
} 

func1(obj1.method1); 

... func1obj1.method1 फोन करेगा, लेकिन क्योंकि हम सभी किया है समारोह वस्तु पारित है यह नहीं alertobj1 के property1 का मूल्य होगा, इसकी this संदर्भ नहीं है। यही वह जगह है जहां call और apply आते हैं। वे आपको स्कोप इंजेक्ट करने की अनुमति देते हैं, फ़ंक्शन बताएं कि this का अर्थ क्या होगा। निम्न उदाहरण काम करता है:

var obj1 = { 
    property1: "blah", 
    method1: function() { 
     alert(this.property1); 
     // do stuff 
    } 
}; 

function func1 (passedObject, passedFunction) { 
    passedFunction.call(passedObject); 
    // do other stuff 
} 

func1(ob1, obj1.method1); 

अब, हम मजबूर कर दिया है या स्पष्ट रूप से obj1.method1 बताया क्या उसके संदर्भ call लागू है, और यह वस्तु यह this के रूप में उपयोग करने के लिए पारित करके करेंगे।

call और apply लगभग समान हैं, सिवाय इसके कि वे कार्य को लागू किए जाने वाले अतिरिक्त तर्कों को कैसे प्रबंधित करते हैं। अधिक जानकारी के लिए एमडीएन पर इन लेखों को देखें: call, apply और Function

यह सब कहा गया है, bb_graphics_GraphicsContext एक निर्माता है। (जिसे आपने शायद अनुमान लगाया है।) आप इसे new कीवर्ड, var obj1 = new bb_graphics_GraphicsContext(); का उपयोग करके आमंत्रित करते हैं। जब यह समारोह की लाइन 1 तक पहुँच जाता है, यह this वस्तु लेता है, और सामान्य Object निर्माता कहता है, स्पष्ट रूप से नई वस्तु this (bb_graphics_GraphicsContext निर्माता में) इंजेक्शन लगाने Object निर्माता की this के रूप में। मुझे लगता है कि इस समारोह/निर्माता का लेखक यह सुनिश्चित करने के लिए ऐसा कर रहा था कि bb_graphics_GraphicsContext में नव निर्मित ऑब्जेक्ट बेस Object के आधारभूत सभी विधियों को प्राप्त कर रहा था। लेकिन मुझे नहीं पता कि यह क्यों जरूरी होगा, जैसे कि bb_graphics_GraphicsContext को new कीवर्ड के साथ कॉल करें, यह स्वाभाविक रूप से इन सभी गुणों को पकड़ लेगा।

+1

यह सब पूरी तरह से सच है, लेकिन यह अभी भी * ऑब्जेक्ट 'कन्स्ट्रक्टर के साथ * क्यों * के सवाल का जवाब नहीं दे रहा है। – Pointy

+0

अच्छा बिंदु। उत्तर संशोधित करना –

+0

क्या यह संभव है कि कोई ऑब्जेक्ट को फिर से परिभाषित करना चाहता था ?? – DrStrangeLove

0

ऑब्जेक्ट.call प्रदान किए गए संदर्भ के तहत एक निश्चित फ़ंक्शन निष्पादित करेगा, इसका उपयोग किसी ऑब्जेक्ट से एक ऑब्जेक्ट पर फ़ंक्शंस को कॉल करने के लिए किया जा सकता है।

mozilla देव नेटवर्क एक बहुत अच्छा विवरण

https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Function/call

+1

इस मामले में "निश्चित कार्य" 'ऑब्जेक्ट' कन्स्ट्रक्टर फ़ंक्शन स्वयं ही है। – Pointy

0

इस संसाधन और स्मृति आवंटन बर्बाद कर को छोड़कर पूरी तरह से कुछ भी नहीं होगा प्रदान करता है।

Object.call (यह) एक चर या समारोह निर्माता bb_graphics_GraphicsContext

this.myObject = वस्तु की संपत्ति को सौंपा गया है जाएगा।कॉल (इस)

केवल एक चीज है कि आप उस उदाहरण में मिलता है एक खाली वस्तु

function MyConstructor(){ 
    this.test01 = 0; 
    var b = Object.call(this); // similar to b = {}; or b = new Object() 
    console.log(b); // log object 
    console.log(b.test); // log undefined 
    this.test = 1; 
} 

var myObject = new MyConstructor(); 

console.log(myObject, window.test01) 
0

"देते हैं कि प्रदान नहीं की जाती संदर्भ पकड़" हालांकि Object.call शायद के रूप में यहाँ व्यक्त कोई कार्य नहीं करेगा, है अवधारणा महत्वपूर्ण हो सकती है। असल में, उदाहरण आप Node.js documentation में विरासत पर देखेंगे:

const util = require('util'); 
const EventEmitter = require('events'); 

function MyStream() { 
    EventEmitter.call(this); 
} 

util.inherits(MyStream, EventEmitter); 

util.inherits एक नया MyStream इनहेरिट EventEmmiter (के रूप में ही प्रोटोटाइप है) कर देगा। यह पर्याप्त हो सकता है अगर हम माइस्ट्रीम में रुचि रखते हैं EventEmmiter प्रोटोटाइप के माध्यम से विरासत में प्राप्त कार्यों तक पहुंच। लेकिन क्या होगा यदि निर्माण पर चर हो गए हैं? क्या होगा अगर हम है:

function MyObject() { 
    this.code = "2nV_ahR"; 
} 

इस मामले में, code वैरिएबल को रनटाइम पर पारित हो जाता है जब MyObject instantiated हो जाता है। इसलिए, एक उपवर्ग पारित करने के लिए की जरूरत है:

function MySubObject() { 
    MyObject.call(this); 
} 

आदेश code चर के वारिस के लिए। call एक पैरामीटर स्वीकार करता है जो this चर सेट करता है। तो ... जब मैं var o = new MySubObject() करते हैं, thisMySubObject के अंदर o है, जो तब call विधि को पारित कर दिया है, ताकि जब MyObjectthis.code = ... करता है यह वास्तव में code को o गुजर रहा है को संदर्भित करता है!

संबंधित मुद्दे