Только бегло прочитав исходный код пакета os
в Репозиторий узла, похоже, что cpus()
экспортируется из binding.getCPUs
который является хуком C в среде выполнения Node.
Таким образом, cpus()
имеет объект binding
в качестве контекста функции, который затем теряется через прокси-сервер, что приводит к ошибке IllegalInvocation
, поскольку при вызове функции нет контекста, хотя я не уверен в деталях.
platform()
, с другой стороны, экспортируется как function () { return process.platform; }
, и, следовательно, это просто функция, которая возвращает объект, и ее не нужно запускать в определенном контексте, поскольку контексты функций Node будут иметь переменную process
, указанную по умолчанию (если только она не была переопределено).
Следующее поведение показывает, что применение os
в качестве контекста к функции cpus
будет работать — прокси на объектах функции, очевидно, теряют контекст функции при вызове свойств.
const os = require('os');
const proxy = new Proxy(os, {}); // proxy of object, functions called get proxy context rather than os context
const cpus = new Proxy(os.cpus, {}); // proxy of function, still has os context
console.log(os.cpus()); // works (duh)
console.log(cpus()); // works
console.log(proxy.cpus.apply(os, [])); // works
console.log(proxy.cpus()); // fails with IllegalInvocation
Примечание. Если кто-то может прояснить детали контекста функции JS для ответа, я бы тоже хотел его прочитать.
person
Liam Gray
schedule
27.02.2017
new Proxy(require('os').cpus, {})
работает нормально... Я так же озадачен, как и вы. - person Liam Gray   schedule 28.02.2017