如何使用 Object.defineProperty() 从自定义库导入原型 getter

How to import prototype getter from custom library using Object.defineProperty()

我想为我的项目创建一个可重用的库。 对于本练习,我有一个主库,然后是一个用于“身份”相关功能的扩展库。

我的想法是,我可以在需要时包含身份模块,并使用 getter 扩展 MainLibrary 以访问与身份相关的任何内容。这是我的代码:

// Main library - index.js (Package name: @mainlib)
export class MainLibrary
{
   // ....
}

// Identity library - index.js (Package name: @mainlib/identity)
import { MainLibrary } from '@mainlib';

export function useIdentity()
{
  Object.defineProperty(MainLibrary.prototype, "identity", {
    get: function()
    {
       // Returns an identity object
       return {
          isAuth: function()
          {
             return false;
          }
       }
    },
    enumerable: true
 });
}

// App
import { MainLibrary } from '@mainlib';
import { useIdentity } from '@mainlib/identity';

useIdentity();

const myLib = new MainLibrary();
myLib.identity.isAuth(); // Throws error, identity is undefined

如果我将 Object.defineProperty 代码移动到我的应用程序中,它就可以正常工作。在我的应用程序中调用 useIdentity() 时,如何在扩展库中定义它并将其应用于 MainLibrary class 原型?

哦,如果相关的话,我正在使用 ViteJS 进行构建。

您应用中的 MainLibrary 对象不是您在扩展中导入的 MainLibrary 对象,因为它本身导入了本地版本。

为了解决这个问题,让 useIdentity 接受一个参数(有效地将它变成所谓的 mixin):

// Identity library - index.js (Package name: @mainlib/identity)
export function useIdentity(context)
{
  Object.defineProperty(context.prototype, "identity", {
    get: function()
    {
       // Returns an identity object
       return {
          isAuth: function()
          {
             return false;
          }
       }
    },
    enumerable: true
 });
}

然后在您的应用中使用它:

// App
import { MainLibrary } from '@mainlib';
import { useIdentity } from '@mainlib/identity';

useIdentity(MainLibrary);

const myLib = new MainLibrary();
myLib.identity.isAuth(); // false