gpt4 book ai didi

使用模块模式时的 Javascript 混入

转载 作者:行者123 更新时间:2023-11-29 22:12:03 24 4
gpt4 key购买 nike

我使用模块模式已有一段时间了,但最近开始想将函数和属性混入其中以增加代码重用。我已经阅读了一些关于这个主题的好资源,但对于最佳方法仍然有点不确定。这是一个模块:

var myModule = function () {
var privateConfigVar = "Private!";

//"constructor"
function module() {}

module.publicMethod = function () {
console.log('public');
}

function privateMethod1() {
console.log('private');
}

return module;
}

这是一个混合对象:

var myMixin = function () {};
Mixin.prototype = {
mixinMethod1: function () {
console.log('mixin private 1');
},
mixinMethod2: function () {
console.log('mixin private 2');
}
};

理想情况下,我想混合一些来自其他对象的方法作为私有(private)方法和一些作为公共(public)方法,这样我就可以调用一些“扩展”函数,参数为“私有(private)”/“公共(public)”。所以,那个

mixin(myModule, myMixin, "private");

通过仅调用 mixinMethod1() 并具有正确的范围,使 myMixin 方法在 myModule 中可用,并且:

mixin(myModule, myMixin, "public");

通过调用 module.mixinMethod1() 使 myMixin 方法在 myModule 中可用并具有正确的作用域

我试过使用一种方法将属性从一个原型(prototype)复制到另一个原型(prototype),我试过使用下划线扩展方法将对象的属性从一个原型(prototype)复制到另一个原型(prototype),以及介于两者之间的各种东西。我认为此时我对范围和原型(prototype)有点转变,并且会喜欢一些关于在使用模块模式时如何最好地进行 mixin 的指导。请注意,对象 myMixin 看起来像什么并不重要(无论是向原型(prototype)添加函数,还是模块本身),我只是想找出一些方法让它工作。

谢谢!

最佳答案

So that [some code] makes the myMixin methods available within myModule by just calling mixinMethod1() and have correct scope

那是不可能的。您不能通过调用函数来修改作用域,尤其是不能从外部调用。另见 Is it possible to import variables in JavaScript?出于设计原因。

那么,您可以做什么?

从模块外

module 函数的私有(private)范围没有任何内容。显然,您不能使用模块的私有(private)函数。你可以用方法(这是最常见的)扩展它的原型(prototype),你甚至可以 decorate its constructor function .在其中,您可以使用自己的私有(private)函数,可以是完全静态的函数,也可以是特定于类的函数。

var myMixin = (function() {
// everything class-unspecific but mixin-local
var staticMixinVariables, …;
function globalPrivateFunction(){…}
function staticMethod(){…}

return function(mod) {
// everything class-specific
// also using the locals from above
mod.staticHelper = function() { staticMixinVariable … };
mod.prototype.mixinMethod1 = staticMethod;
mod.prototype.mixinMethod2 = function(){…};

};
})();

// Example:
myMixin(SomeClass)

从模块内部

在模块代码本身中使用 mixin 可以提供更大的灵 active 。

var myMixin = (function() {
// everything class-unspecific but mixin-local

return {
publicHelper1: function(){…},
publicHelper2: function(){…},
decorateInstance: function(o) {
o.xy = …;
},
extendPrototype: function(proto) {
// everything class-specific
// also using the locals from above
proto.mixinMethod1 = staticMethod;
proto.mixinMethod2 = function(){…};

}
};
})();

有了这样的接口(interface),就可以很容易地构造一个使用它作为混合(而不是从它继承)的类:

var myClass = (function() {
function Constructor() {
myMixin.decorateInstance(this);

}
Constructor.prototype.method1 = function() { myMixin.publicHelper1() … };
Constructor.prototype.method2 = function() { … };
myMixin.extendPrototype(Constructor.prototype);
Constructor.myHelper = myMixin.publicHelper2; // re-export explicitly
return Constructor;
})();

但是,mixin 永远无法访问私有(private)类变量,也不能提供私有(private)的、类特定的 API。尽管如此,我们仍然可以使用依赖注入(inject)来显式提供该访问(并使混合工厂生效):

var myClass = (function() {
var … // private class functions and variables
var mixer = myMixin(privateClassHelper,
privateClassVariable,
function setPrivateVar(x) {…},
… );
var myHelper = mixer.customHelper, … // local "aliases"
function Constructor(localX) {
mixer.decorateInstance(this, localX);

}
… // further using the class-specific private mixer
return Constructor;
})();

并非上面显示的所有技术都需要在每个 mixin 中使用,只需选择您需要的那些即可。上面的例子并没有展示所有可能的技术,另外 :-) mixin 模式也可以应用于普通模块或其声明中,上面的例子只展示了带有原型(prototype)的类。

关于一些很好的例子,以及(无状态)Traits、(有状态)Mixins 和它们的“特权”对应物之间的理论区别,请查看 this presentation .

关于使用模块模式时的 Javascript 混入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17631517/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com