2015-02-12 2 views
1

Во время игры с custom elements Я замечаю, что функция attachedCallback имеет заполненную attributes коллекцию. А именно, это NamedNodeMap, содержащий все переданные атрибуты элементу.Все параметры не определены, но атрибуты имеют значения

Я также замечаю, что указание параметров в функции attachedCallback всегда вызывает undefined.

Как можно установить коллекцию attributes внутри функции, но имеют ли какие-либо указанные параметры undefined? Это просто из-за реализации поставщика браузера или есть способ сделать это в JavaScript, о котором я не знаю?

Пример:

var proto = Object.create(HTMLElement.prototype); 
    proto.attachedCallback = function (elem) { 
     console.log(elem); // undefined 
     console.log(this.attributes); // NamedNodeMap 
    }; 
+0

Если вы знакомы с тем, как это работает в JavaScript, это не удивительно. http://jsfiddle.net/Lbrujmwc/1/ – JLRishe

+0

Да, вы правы. По какой-то причине я не думал о атрибутах как о свойствах прототипа функции. Кажется очевидным сейчас. –

ответ

1

Где-то в стеке, вызов делается для apply или call, где первый аргумент является объектом, который содержит attributes свойство.

Вот как вы можете сделать это в коде:

var proto = Object.create(HTMLElement.prototype); 
proto.attachedCallback = function (elem) { 
    console.log(elem); // undefined 
    console.log(this.attributes); // NamedNodeMap 
}; 

var randomObjectWithAttributes = { 
    attributes: new NamedNodeMap() 
}; 

proto.attachedCallback.call(randomObjectWithAttributes); 

Это одна из тонкостей Javascript, что вы можете использовать call и apply для лечения функции, если они принадлежат к прототипу объекта, даже если они этого не делают.

+1

Спасибо Остин. Теперь, когда вы указали это, это кажется очевидным. Я не думал о атрибутах как о свойствах прототипа. Приветствия. –

Смежные вопросы