- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我使用模块模式已有一段时间了,但最近开始想将函数和属性混入其中以增加代码重用。我已经阅读了一些关于这个主题的好资源,但对于最佳方法仍然有点不确定。这是一个模块:
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/
SQLite、Content provider 和 Shared Preference 之间的所有已知区别。 但我想知道什么时候需要根据情况使用 SQLite 或 Content Provider 或
警告:我正在使用一个我无法完全控制的后端,所以我正在努力解决 Backbone 中的一些注意事项,这些注意事项可能在其他地方更好地解决......不幸的是,我别无选择,只能在这里处理它们! 所以,我的
我一整天都在挣扎。我的预输入搜索表达式与远程 json 数据完美配合。但是当我尝试使用相同的 json 数据作为预取数据时,建议为空。点击第一个标志后,我收到预定义消息“无法找到任何内容...”,结果
我正在制作一个模拟 NHL 选秀彩票的程序,其中屏幕右侧应该有一个 JTextField,并且在左侧绘制弹跳的选秀球。我创建了一个名为 Ball 的类,它实现了 Runnable,并在我的主 Draf
这个问题已经有答案了: How can I calculate a time span in Java and format the output? (18 个回答) 已关闭 9 年前。 这是我的代码
我有一个 ASP.NET Web API 应用程序在我的本地 IIS 实例上运行。 Web 应用程序配置有 CORS。我调用的 Web API 方法类似于: [POST("/API/{foo}/{ba
我将用户输入的时间和日期作为: DatePicker dp = (DatePicker) findViewById(R.id.datePicker); TimePicker tp = (TimePic
放宽“邻居”的标准是否足够,或者是否有其他标准行动可以采取? 最佳答案 如果所有相邻解决方案都是 Tabu,则听起来您的 Tabu 列表的大小太长或您的释放策略太严格。一个好的 Tabu 列表长度是
我正在阅读来自 cppreference 的代码示例: #include #include #include #include template void print_queue(T& q)
我快疯了,我试图理解工具提示的行为,但没有成功。 1. 第一个问题是当我尝试通过插件(按钮 1)在点击事件中使用它时 -> 如果您转到 Fiddle,您会在“内容”内看到该函数' 每次点击都会调用该属
我在功能组件中有以下代码: const [ folder, setFolder ] = useState([]); const folderData = useContext(FolderContex
我在使用预签名网址和 AFNetworking 3.0 从 S3 获取图像时遇到问题。我可以使用 NSMutableURLRequest 和 NSURLSession 获取图像,但是当我使用 AFHT
我正在使用 Oracle ojdbc 12 和 Java 8 处理 Oracle UCP 管理器的问题。当 UCP 池启动失败时,我希望关闭它创建的连接。 当池初始化期间遇到 ORA-02391:超过
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 9 年前。 Improve
引用这个plunker: https://plnkr.co/edit/GWsbdDWVvBYNMqyxzlLY?p=preview 我在 styles.css 文件和 src/app.ts 文件中指定
为什么我的条形这么细?我尝试将宽度设置为 1,它们变得非常厚。我不知道还能尝试什么。默认厚度为 0.8,这是应该的样子吗? import matplotlib.pyplot as plt import
当我编写时,查询按预期执行: SELECT id, day2.count - day1.count AS diff FROM day1 NATURAL JOIN day2; 但我真正想要的是右连接。当
我有以下时间数据: 0 08/01/16 13:07:46,335437 1 18/02/16 08:40:40,565575 2 14/01/16 22:2
一些背景知识 -我的 NodeJS 服务器在端口 3001 上运行,我的 React 应用程序在端口 3000 上运行。我在 React 应用程序 package.json 中设置了一个代理来代理对端
我面临着一个愚蠢的问题。我试图在我的 Angular 应用程序中延迟加载我的图像,我已经尝试过这个2: 但是他们都设置了 src attr 而不是 data-src,我在这里遗漏了什么吗?保留 d
我是一名优秀的程序员,十分优秀!