MDN описывает причину ошибки
дескрипторы собственности, присутствующие в объектах в двух основных вариантах: данные дескрипторов и аксессоры дескрипторы. Дескриптор данных - это свойство , которое имеет значение, которое может быть или не быть доступно для записи. Дескриптор доступа - это свойство, описываемое парой установочных коэффициентов из . Дескриптор должен быть одним из этих двух вариантов; не может быть обе.
Существует причина для этого: так, как вы хотите, будет неоднозначным: если parent()
была функция, то parent
бы вернуть эту функцию и-газопоглотитель?
также не изменяйте объект, который вам не владеет. Такой код не подлежит ремонту: если кто-то определит свой собственный Object.prototype.parent()
в своей библиотеке, вы не сможете его использовать. Перед любым использованием любого кода вам нужно будет отследить, что было изменено. Это будет то же самое, что писать все с нуля.
Object.prototype
особенно плохая идея изменить: по прототипу добавить функцию parent()
для каждого массива, объект JSON, webAPI объектов ... они не имеют parentNode
, так что функция совершенно бесполезна для них, это просто бремя производительности.
Предыдущие два абзаца являются причиной того, что у нас есть Object.defineProperty
, а не Object.prototype.defineProperty
. Обратите внимание: если это так, вы можете ввести код myAPI.defineproperty(...)
в код ниже, который короче, НО ... производительность и дизайн ... schrecklich.
Вы могли кодировать что-то вроде этого
var myAPI = {
node: document.body,
level: 1
};
Object.defineProperty(MyAPI,'parent',{
get:function(){
var temp=MyAPI.node.parentNode;
// some sanity check should be performed here
for(var i=1;i<MyAPI.level;i++){temp=temp.parentNode};
return temp;
}
});
myAPI.node = document.getElementById("myNode");
myAPI.level = 2;
var grandFather = myAPI.parent; // actually returns the grandparent
, но я сомневаюсь, что это было бы полезно.
Я знаю, что это не в тему, но почему вы расширяете 'Object.prototype', чтобы улучшить элементы DOM? Не представляется полезным добавлять DOM-ориентированные методы к * всем * объектам. –
@CrazyTrain Я понимаю вашу озабоченность ... но все, что я делаю, необходимо ... – NazKazi
@BlackCobra: Нет, вы не можете создать значение, являющееся как узлом DOM, так и функцией. И это даже не связано с смешиванием дескрипторов свойств доступа и данных. Скажите, пожалуйста, [что ваша фактическая проблема] (http://meta.stackexchange.com/q/66377) - что вам понадобится для этого странного расширения DOM для - и мы могли бы предложить лучшее решение. – Bergi