2015-11-03 45 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/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/getOwnPropertyDescriptor),然后添加['Object.defineProperty()'](https://developer.mozilla.org/en-US/docs/Web/ JavaScript/Reference/Global_Objects/Object/defineProperty)和你想要的名字 – Grundy

+0

@MarkC。 'HTMLElement.offsetWidth' is _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>

,然后你可以调用现有的HTML元素的新w财产。

UPDATE您的评论。

如果你想添加功能的对象,并呼吁它没有()你应该定义属性与getter

有关与样本属性的详细信息请参见文档: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()。left'的东西?所以基本上是别名方法的属性......?不知道这是否合理!我得到的最接近的是使用'Element.prototype.x = function(){return this.getBoundingClientRect()。left}'但也许有一些魔法让它工作而不使用括号? – Nightfever

+1

@Nightfever,如果你想'Element.prototype.x'而不是'Element.prototype.x()'你不应该添加函数字段,而是'property'。尝试查看['Object.defineProperty']的文档(https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/defineProperty) - 您只需要定义getter – Grundy

+1

@Nfefever,尝试看更新的答案,我认为现在应该更清楚:-) – Grundy