如何使用 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
我想为我的项目创建一个可重用的库。 对于本练习,我有一个主库,然后是一个用于“身份”相关功能的扩展库。
我的想法是,我可以在需要时包含身份模块,并使用 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