Вы когда-нибудь задумывались о добавлении новых свойств и методов к существующему классу или объекту !!

Да, это возможно в javascript.

Object.defineProperty () здесь, чтобы спасти

/* 
suppose you want to add new methods to the pre-defined Date         class in javascript 
*/
/* 
here we are going to add new method called "diff" to calculate difference between two dates in days
*/

Object.defineProperty(Date.prototype,'diff', {
value: (date1, date2) => {
         return (new Date(date1) - new Date(date2))/(1000*60*60)/24         
       }
})

Object.defineProperty принимает три аргумента.

  1. Объект, на котором определяется свойство.
  2. Название метода, который нужно добавить
  3. Объект конфигурации

Объект конфигурации может содержать

  1. configurable: Boolean true тогда и только тогда, когда тип этого дескриптора свойства может быть изменен и если свойство может быть удалено из соответствующего объекта.
    По умолчанию _2 _.
  2. enumerable: Boolean true тогда и только тогда, когда это свойство отображается во время перечисления свойств соответствующего объекта.
    По умолчанию false.
  3. значение: значение, связанное со свойством. Может быть любым допустимым значением JavaScript (числом, объектом, функцией и т. Д.).
  4. доступно для записи: true тогда и только тогда, когда значение, связанное со свойством, может быть изменено с помощью assignment operator.
    По умолчанию false.
  5. get: функция, которая служит получателем для свойства, или undefined, если получателя нет. При обращении к свойству эта функция вызывается без аргументов и с this, установленным для объекта, через который осуществляется доступ к свойству (это может быть не тот объект, для которого свойство определено из-за наследования). Возвращаемое значение будет использоваться как значение свойства.
    По умолчанию undefined.
  6. set: функция, которая служит установщиком для свойства, или undefined, если установщика нет. Когда свойство назначается, эта функция вызывается с одним аргументом (значение, присваиваемым свойству) и с this, установленным для объекта, через который это свойство назначается.
    По умолчанию undefined.
const date1 = new Date('2020/02/10');
const date2 = new Date('2020/02/02');
//  now we can use our new method
const diffrenceInDays = new Date().diff(date1, date2);
console.log(diffrenceInDays);
 ===== output =====
 8

Точно так же мы можем добавлять новые методы и свойства к любому классу или объекту.

Ваше здоровье! 👋