2013-07-24 7 views
11

की 'छुपी कक्षाओं' अवधारणा को साफ़ करना मैंने वी 8 के छिपा वर्गों के बारे में कुछ लेख पढ़े हैं।वी 8

हैं, तो मान लें, वहाँ दो वस्तुओं रहे हैं: हालांकि, मैं अभी भी मेरे सिर में कुछ प्रश्न हैं

var a = { } 
a.x = 5 
a.y = 6 

var b = { } 
b.y = 7 
b.x = 8 

वे एक ही छिपा वर्ग के साथ अंत या अलग सिर्फ इसलिए कि एक 0 + x + y चला गया है और अन्य 0 + y + x? जैसा कि मैंने समझा, उन्हें अलग-अलग वर्ग मिलते हैं लेकिन सिर्फ यह सुनिश्चित करना चाहते हैं कि मुझे यह मिल गया।

function Point(x, y) { 
    this.x = x 
    this.y = y 
} 
var a = new Point(7, 8) 

var b = { } 
b.x = 6 
b.y = 8 

var c = { 
    x: 8, 
    y: 9 
} 

var d = { 
    y: 9, 
    x: 80 
} 

हम एक ही छिपा वर्ग के साथ खत्म करें:

फिर, हम इस मामले है? मुझे लगता है कि a, b और c करें लेकिन d नहीं है। जब तक इस ऑब्जेक्ट एक्सप्रेशन पर कुछ सॉर्टिंग नहीं किया जाता है (इसी प्रकार सरणी की छोटी घोषणा प्रकार के लिए विश्लेषण की जा रही है)।

function PointA(x, y) { 
    this.x = x 
    this.y = y 
} 
var a = new PointA(7, 8) 

function PointB(x, y) { 
    this.x = x 
    this.y = y 
} 
var b = new PointB(7, 8) 

यह sorta दूसरे मामले के समान है:

अंत में, हम इस किया है। ये वस्तुएं समान दिखाई देती हैं सिवाय इसके कि उनकी उत्पत्ति (instanceof...) अलग है। हालांकि, क्या वही छुपे हुए वर्ग के साथ वस्तुएं समाप्त होती हैं?

+1

जावास्क्रिप्ट में कक्षाएं नहीं हैं। छुपे हुए वर्ग अवधारणा नहीं हैं, वे कार्यान्वयन के आंतरिक विवरण हैं। जब तक आप v8 या अन्य वर्चुअल मशीन को हैक करना नहीं चाहते हैं, जिसे समान समस्या हल करने की आवश्यकता है, तो आपको परवाह नहीं है। –

+3

मुझे वास्तव में मेरे द्वारा लिखे गए कोड के प्रदर्शन की परवाह है। मैंने अपने आप का अनुभव किया है कि प्रदर्शन के बारे में परवाह करना आसान है * जैसा कि आप जाते हैं * इसके बारे में देखभाल करने के बजाए जब कोई शिकायत करता है कि यह बहुत धीरे-धीरे चलता है। – Pijusn

+0

प्रदर्शन के पहलू हैं जिन्हें आपको वास्तव में देखभाल करने की आवश्यकता है। इष्टतम एल्गोरिदम चुनने की तरह, कैशिंग डेटा जिसे आपको अक्सर और ऐसे की आवश्यकता होती है। लेकिन अगर आपको वास्तव में इस स्तर पर प्रदर्शन की परवाह करने की ज़रूरत है, तो आपको शायद पहले स्थान पर जावास्क्रिप्ट का उपयोग नहीं करना चाहिए। –

उत्तर

14

यदि आप वी 8 डाउनलोड करते हैं और डीबग संस्करण बनाते हैं तो आप उन वस्तुओं को अनगिनत लूप में किसी फ़ंक्शन में यादृच्छिक रूप से पास कर सकते हैं और इसे अनुकूलित डिस्सेप्लर प्रिंट कर सकते हैं और देख सकते हैं कि उन्हें एक ही कक्षा के रूप में माना जाता है या नहीं।

पहले मामले में आप सही हैं कि उनके पास अलग-अलग छिपे हुए वर्ग होंगे।


दूसरे मामले में आप गलत हैं, तो आप 4 अलग-अलग वर्गों के साथ समाप्त हो जाएंगे, इसलिए उनमें से कोई भी कक्षा साझा नहीं करेगा।

सबसे पहले, जो क्षेत्र कन्स्ट्रक्टर या ऑब्जेक्ट शाब्दिक के बाहर किसी ऑब्जेक्ट में जोड़े जाते हैं, उन्हें ऑब्जेक्ट पर सीधे पर संग्रहीत नहीं किया जाएगा बल्कि ऑब्जेक्ट के बाहर एक सरणी में संग्रहीत किया जाएगा। इसलिए यही कारण है कि b में सभी से अलग छिपी कक्षा होगी।

एक अद्वितीय निर्माता अद्वितीय वर्ग की वस्तुओं का निर्माण करेगा, इसलिए a में सभी से अलग छिपी कक्षा होगी। ऑब्जेक्ट अक्षरों में अलग-अलग क्रम में गुण होते हैं जो पहले मामले में समान स्थिति में होते हैं।

हालांकि बिल्कुल एक ही लेआउट एक छिपे हुए वर्ग का हिस्सा होगा साथ शाब्दिक वस्तु है, इसलिए यदि हम वस्तु e कहा:

var e = { 
    x: 32, 
    y: -15 
}; 

फिर ce के साथ एक ही छिपा वर्ग का हिस्सा होगा।


तीसरे मामले में वे दूसरे मामले में के रूप में ही कारण के लिए अलग छिपा कक्षाएं होगा, अद्वितीय कंस्ट्रक्टर्स विभिन्न वर्गों की वस्तुओं का निर्माण।


आप भी इस दिलचस्प https://codereview.stackexchange.com/a/28360/9258

+0

** एक ही छिपी कक्षा ** होने का बड़ा सौदा क्या है? क्या आप कृपया बता सकते हैं? – TrungDQ

+1

यह सब कुछ प्रदर्शन के बारे में है क्योंकि ऑप्टिमाइज़र कोड साइटों को अलग-अलग प्रबंधित करता है, इस पर निर्भर करता है कि छुपे वर्गों को किस प्रकार समर्थित किया जाना चाहिए। यदि, उदाहरण के लिए, कोड की एक विशेष पंक्ति में, एक विशेष तर्क में हमेशा एक ही छिपी कक्षा होती है, तो कॉल को मोनोमोर्फिक माना जा सकता है जो [अधिक आक्रामक इनलाइन कैशिंग] (http://en.wikipedia.org/wiki) की अनुमति देता है/Inline_caching # Monomorphic_inline_caching) और अन्य अनुकूलन रणनीतियों। – Domi

5

आप आसानी से वी 8 के डिबगिंग खोल d8 का उपयोग करके जाँच कर सकते हैं हो सकता है।

// test1.js 
var a = { } 
a.x = 5 
a.y = 6 

var b = { } 
b.y = 7 
b.x = 8 

print(%HaveSameMap(a, b)); 

फिर चलाने

$ d8 --allow-natives-syntax test1.js 

आप करेंगे अपेक्षित आउटपुट मिलता है:

false 

आप दूसरे उदाहरण के लिए:

//test2.js 
function Point(x, y) { 
    this.x = x 
    this.y = y 
} 

var a = new Point(7, 8) 

var b = { } 
b.x = 6 
b.y = 8 

var c = { 
    x: 8, 
    y: 9 
} 

var d = { 
    y: 9, 
    x: 80 
} 

print(%HaveSameMap(a, b)); 
print(%HaveSameMap(b, c)); 
print(%HaveSameMap(b, d)); 
print(%HaveSameMap(c, d)); 

सभी 4 वस्तुओं विभिन्न छिपा श्रेणियां होती हैं :

$ d8 --allow-natives-syntax test2.js 
false 
false 
false 
false 

और अंत में कम से कम:

// test3.js 
function PointA(x, y) { 
    this.x = x 
    this.y = y 
} 
var a = new PointA(7, 8) 

function PointB(x, y) { 
    this.x = x 
    this.y = y 
} 
var b = new PointB(7, 8) 
var c = new PointB(1,4) 

print(%HaveSameMap(a, b)); 
print(%HaveSameMap(b, c)); 

a और b विभिन्न छिपा कक्षाएं, लेकिन b और c एक ही है।

$ d8 --allow-natives-syntax test3.js 
false 
true 
संबंधित मुद्दे