2015-11-03 7 views
9

क्या यह उपनाम के लिए संभव है HTMLElement.offsetWidth संपत्ति, उसी तरह मैं तरहएलिसिंग इंटरफेस संपत्ति

EventTarget.prototype.on = EventTarget.prototype.addEventListener 

तरीकों उर्फ ​​कर सकते हैं मैंने कोशिश की:

HTMLElement.prototype.w = HTMLElement.prototype.offsetWidth 

लेकिन मिल गया:

TypeError: 'offsetWidth' getter called on an object that does not implement interface HTMLElement.

+1

आप [ 'Object.getOwnPropertyDescriptor()'] प्राप्त कर सकते हैं (https://developer.mozilla.org/एन-यूएस/डॉक्स/वेब/जावास्क्रिप्ट/संदर्भ/ग्लोबल_ऑब्जेक्ट्स/ऑब्जेक्ट/getOwnPropertyDescriptor) और फिर ['object.defineProperty()'] जोड़ें (https://developer.mozilla.org/en-US/docs/Web/ जावास्क्रिप्ट/संदर्भ/ग्लोबल_ऑब्जेक्ट्स/ऑब्जेक्ट/डिफिनप्रोपर्टी) जो नाम आप चाहते हैं – Grundy

+0

@MarkC। 'HTMLElement.offsetWidth' _undefined_ – Grundy

+0

@Grundy बिल्कुल सही है, मैंने कुछ गलत तरीके से पढ़ा था। मुझे सही करने के लिए धन्यवाद –

उत्तर

8

offsetWidth एक संपत्ति है, और जब आप

करना
HTMLElement.prototype.offsetWidth 

वास्तव में get फ़ंक्शन को कॉल कर रहा है, इसलिए जब आप प्रोटोटाइप पर आज़माते हैं - आपको त्रुटि मिलती है।

तो आप संपत्ति निर्दिष्ट नहीं कर सकते हैं, इसके बजाय आप get descriptor for this property सभी सेटिंग्स के साथ, और फिर define property इस वर्णनकर्ता के साथ, लेकिन जिस नाम से आप चाहते हैं उसके साथ।

var descriptor = Object.getOwnPropertyDescriptor(HTMLElement.prototype, "offsetWidth"); 
 
Object.defineProperty(HTMLElement.prototype, "w", descriptor); 
 

 
var p = document.getElementById('p'); 
 

 
console.log('offsetwidth=%i, w=%i',p.offsetWidth,p.w);
<p id='p'>123</p>

और फिर आप मौजूदा HTMLElement पर नए w संपत्ति कॉल कर सकते हैं।

आपकी टिप्पणी के लिए अपडेट करें।

यदि आप ऑब्जेक्ट में फ़ंक्शन जोड़ना चाहते हैं और () के बिना इसे कॉल करना चाहते हैं तो आपको गेटर के साथ संपत्ति को परिभाषित करना चाहिए।

नमूने के साथ गुणों के बारे में अधिक जानकारी के लिए दस्तावेज़ में देखें: MDN : Object.defineProperty()

Object.defineProperty(HTMLElement.prototype, "x", { 
 
    get: function() { return this.getBoundingClientRect().left } 
 
}); 
 

 
var p = document.getElementById('p'); 
 

 
console.log('left=%i, x=%i',p.getBoundingClientRect().left,p.x);
<p id='p'>123</p>

+0

बहुत बढ़िया, एक आकर्षण की तरह काम करता है! क्या कुछ ऐसा करने का कोई तरीका है जो 'HTMLElement.prototype.x = HTMLElement.prototype.getBoundingClientRect() के समान होगा। काम करने के लिए बाएं '? तो मूल रूप से एक विधि की संपत्ति aliasing ...? यकीन नहीं है कि अगर यह समझ में आता है! मुझे मिला सबसे नज़दीक 'Element.prototype.x = function() {का उपयोग कर रहा था .getBoundingClientRect()। Left}' लेकिन शायद कुछ जादू है जो इसे ब्रांड्स का उपयोग किए बिना काम करने के लिए है? – Nightfever

+1

@ नाइटफेवर, यदि आप 'Element.prototype.x' के बजाय' Element.prototype.x ') चाहते हैं, तो आपको फ़ंक्शन फ़ील्ड नहीं जोड़ना चाहिए, बल्कि' प्रॉपर्टी '। ['Object.defineProperty'] के लिए दस्तावेज़ देखने का प्रयास करें (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/defineProperty) - आपको केवल गेटर – Grundy

+1

@ नाइटफेवर परिभाषित करने की आवश्यकता है, अद्यतन उत्तर देखने का प्रयास करें, मुझे लगता है कि अब यह और स्पष्ट होना चाहिए :-) – Grundy

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