2015-11-03 15 views
9

Có thể có bí danh, ví dụ: các HTMLElement.offsetWidth tài sản, giống như cách tôi có thể bí danh các phương pháp nhưThuộc tính giao diện bí danh

EventTarget.prototype.on = EventTarget.prototype.addEventListener 

tôi đã cố gắng:

HTMLElement.prototype.w = HTMLElement.prototype.offsetWidth 

nhưng có:

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

+1

bạn có thể nhận [ 'Object.getOwnPropertyDescriptor()'] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Tham chiếu/Global_Objects/Object/getOwnPropertyDescriptor) và sau đó thêm ['Object.defineProperty()'] (https://developer.mozilla.org/en-US/docs/Web/ JavaScript/Tham chiếu/Global_Objects/Object/defineProperty) với tên bạn muốn – Grundy

+0

@MarkC. 'HTMLElement.offsetWidth' là _undefined_ – Grundy

+0

@Grundy Hoàn toàn chính xác, tôi đã hiểu sai điều gì đó. Cảm ơn bạn đã sửa tôi –

Trả lời

8

offsetWidth là một tài sản, và khi bạn làm

HTMLElement.prototype.offsetWidth 

thực sự gọi hàm get, vì vậy khi bạn thử nếu trên nguyên mẫu - bạn gặp lỗi.

Vì vậy, bạn không thể chỉ định thuộc tính, thay vào đó bạn có thể get descriptor for this property với tất cả các cài đặt và sau đó define property với bộ mô tả này, nhưng với tên bạn muốn.

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>

và sau đó bạn có thể gọi w tài sản mới trên phần tử html hiện có.

CẬP NHẬT cho nhận xét của bạn.

Nếu bạn muốn thêm hàm vào đối tượng và gọi hàm đó mà không cần (), bạn nên xác định thuộc tính với getter.

Đối với thông tin thêm về các thuộc tính với mẫu nhìn thấy trong doc: 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

Tuyệt vời, hoạt động như một sự quyến rũ! Có cách nào để có được một cái gì đó mà sẽ giống với 'HTMLElement.prototype.x = HTMLElement.prototype.getBoundingClientRect(). Left' để làm việc? Vì vậy, về cơ bản răng cưa tài sản của một phương pháp ...? Không chắc chắn nếu điều đó có ý nghĩa! Gần nhất tôi đã nhận được bằng cách sử dụng 'Element.prototype.x = function() {return this.getBoundingClientRect(). Left}' nhưng có lẽ có một số phép thuật để làm cho nó hoạt động mà không cần sử dụng dấu ngoặc đơn? – Nightfever

+1

@Nightfever, nếu bạn muốn 'Element.prototype.x' thay vì' Element.prototype.x() ', bạn nên thêm trường không hàm, nhưng' property'. Hãy thử xem doc cho ['Object.defineProperty'] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/defineProperty) - bạn chỉ cần xác định getter – Grundy

+1

@Nightfever, hãy thử xem câu trả lời cập nhật, tôi nghĩ bây giờ nó phải rõ ràng hơn :-) – Grundy

Các vấn đề liên quan