Уничтожение функции из объекта (Date Object) - PullRequest
0 голосов
/ 30 января 2019

Если я хочу уничтожить объект, я бы сделал:

const obj = {
  a: 'a',
  fn: () => 'some function'
}

// const fn = obj.fn;
// OR

const {
  a,
  fn
} = obj;

console.log( fn() );

это не работает для Date объекта:

Uncaught TypeError: это не объект Date.

const date = new Date();

const day = date.getDate();
console.log(day); // works

const {
  getDate
} = date;
console.log( getDate() ); // doesn't work

Почему это возможно с первым Объектом, а не с Date?как можно достичь этого, если это возможно.

Ответы [ 2 ]

0 голосов
/ 30 января 2019

Вероятно, это того не стоит, но вы могли бы написать функцию, которая поможет вам деструктурировать методы объекта.Здесь bindMethods делает это, используя помощник allKeys, который собирает ключи из всей цепочки прототипов объекта и который в свою очередь зависит от walkPrototypeChain.Очевидно, что при желании их можно сложить в одну функцию.

const walkPrototypeChain = (process, init, finish) => (obj) => {
  let currObj = obj, currRes = init();
  do {
    currRes = process(currRes, currObj)
  } while (currObj = Object.getPrototypeOf(currObj))
  return finish(currRes)
}

const allKeys = walkPrototypeChain(
  (set, obj) => {Object.getOwnPropertyNames(obj).forEach(k => set.add(k)); return set},
  () => new Set(),
  s => [...s]
)

const bindMethods = (obj) => allKeys(obj).reduce(
  (o, n) => typeof obj[n] == 'function' ? ({...o, [n]: obj[n].bind(obj)}) : o, 
  {}
)

const date = new Date()
const {getDate, getFullYear} = bindMethods(date) // or any other date function

console.log(getDate())
console.log(getFullYear())
0 голосов
/ 30 января 2019

Потому что this это не объект Date.Когда вы вызываете getDate() без соответствующего контекста (т. Е. date.getDate()), вы вызываете его в контексте window (или null в строгом режиме).Ни window, ни null не являются объектами Date, поэтому функция завершается ошибкой.

Попробуйте const getDate = date.getDate.bind(date);

Демо:

const test = { fn : function() { return this.constructor; } };

const normal = test.fn();
console.log(normal); // object

const {fn} = test;
console.log( fn() ); // window

const bound = test.fn.bind(test);
console.log( bound() ); // object
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...