logDiv = () => {
console.log(this.firstValue/this.secondValue);
}
function bindClassMethods(cls) {
return class extends cls {
constructor(...args) {
super(...args);
let proto = this;
let keys = new Set();
do {
Object.getOwnPropertyNames(proto).forEach(
key => typeof this[key] === 'function'
&& key !== 'constructor'
&& keys.add(key)
);
proto = Object.getPrototypeOf(proto);
} while (
proto && proto !== Object.prototype
);
for(const key of keys) {
this[key] = this[key].bind(this);
}
}
}
}
const BindedCalculator = bindClassMethods(Calculator);
const calculator = new BindedCalculator(12, 3);
this
то, что стоит у него перед точкой. Это позволят экономить память и эффективно оптимизировать вызовы.bind
: const detached = object.method.bind(object);
, но по сути - это просто создание функции-обёртки. function cloneAndIncrement(element, ...attrs) {
const copy = element.cloneNode(true);
attrs.forEach(attr => {
const selector = `[${attr}]`;
const list = [...copy.querySelectorAll(selector)];
if(copy.matches(selector))
list.push(copy);
if(list.length === 0)
return;
list.forEach(node => {
let flag = false;
const text = node
.getAttribute(attr)
.replace(/\d+(?=$|\s)/, n => (flag = true) && ++n);
if(flag)
node.setAttribute(attr, text);
});
});
return copy;
}
const panel = document.querySelector('.panel.panel-default');
const clone = cloneAndIncrement(panel, 'id', 'href', 'aria-controls', 'aria-labelledby');
panel.after(clone);
order
. Условно так:youtube-dl
. Если тебе нужно получить поток внутри расширения - скачивай расширение <sitename> downloader
и кури сырцы.