在 javascript 中选择 OOP 模式

2023-11-25

我在其他人的帮助和一些资源的帮助下将这些放在一起。我做了一个一切的小提琴,下面发布了精简的代码。

基本上我已经学会了如何使用这些模式,但我很好奇这些方法之间更根本的区别。下游代码实际上与这些模式中的任何一种都相同,但是除了个人偏好之外,是否有理由使用其中一种而不是另一种?另外,尽管我尝试收集最常见的模式,但如果更好的话,请提出您自己的模式。

模式 1(基于对象):

var mouseDiff = {
    "startPoint" : {"x" :0, "y" : 0},
    "hypotenuse" : function(a,b) {
        // do something
    },
    "init"       : function(){
        // do something
    }
}

mouseDiff.init();

模式2(据我所知最传统):

function MouseDiff() {
    this.startPoint = {"x" :0, "y" : 0};
}

MouseDiff.prototype.hypotenuse = function(a,b) {
    // do something
}

MouseDiff.prototype.init = function() {
    // do something
}

var myMouse = new MouseDiff;
myMouse.init();

模式 3(利用闭包):

var MouseDiff2 = (function() {
    var startPoint = {"x" :0, "y" : 0};
    var hypotenuse = function(a,b) {
        // do something
    };
    return {
        hypotenuse: hypotenuse,
        init : function(){
            // do something
        }
    };

}());
MouseDiff2.init();

模式 1 是单例模式。如果您只需要一个这样的对象,那就没问题了。

模式 2 构建新对象,并利用prototype对象,以便当一个新的MouseDiff创建对象后,它不会创建函数的新副本(它们本身就是 JavaScript 中的数据)。

与常规单例相比,模式 3 需要更多内存,但它提供静态隐私。

我喜欢下面的模式,因为它涵盖了各种功能,尽管它实际上是构造函数(模式 2)和闭包(模式 3)的组合:

var MouseDiff = (function () {

    var aStaticVariable = 'Woohoo!';
    // And if you really need 100% truly private instance
    // variables which are not methods and which can be
    // shared between methods (and don't mind the rather
    // big hassle they require), see
    // http://brettz9.blogspot.com/search?q=relator
    // (see also the new plans for a Map/WeakMap in ECMAScript)

    function _APrivateStaticMethod () {
        alert(aStaticVariable);
    }

    // An instance method meant to be called on the
    //   particular object as via ".call(this)" below
    function _APrivateInstanceMethod () {
        alert(this.startPoint.x);
    }

    // Begin Constructor
    function MouseDiff() {
        this.startPoint = {"x" :0, "y" : 0};
    }

    MouseDiff.prototype.hypotenuse = function(a,b) {
        // do something
    };

    MouseDiff.prototype.init = function() {
        // do something
        _APrivateStaticMethod(); // alerts 'Woohoo!'
        _APrivateInstanceMethod.call(this); // alerts 0 (but if not
        // called with this, _APrivateInstanceMethod's internal
        // "this" will refer (potentially dangerously) to the
        // global object, as in the window in the browser unless
        // this class was defined within 'strict' mode in which
        // case "this" would be undefined)
    };

    return MouseDiff;
}());

var myMouse = new MouseDiff;
myMouse.init();
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 javascript 中选择 OOP 模式 的相关文章

随机推荐

  • Facebook 页面自动“赞”URL(用于 QR 码)

    我想知道是否可以构建一个 URL 来自动喜欢 Facebook 页面 然后 这个 URL 可以转换为 QR 码 这样人们就可以通过使用智能手机阅读您的页面来自动 喜欢 您的页面 我已经搜索了很多 但到目前为止我所能找到的只是商业服务 例如S
  • AppCompatActivity.onCreate 只能从同一库组内调用

    升级到appcompat后25 1 0我开始遇到奇怪的错误 在我的代码中 Override protected void onCreate Bundle savedInstanceState super onCreate savedInst
  • SSIS 存储过程调用

    我正在尝试调用一个简单的存储过程 它将返回正常测试格式的名称列表 全部在一行中 我向它传递了两个参数 但无论我如何设置调用 无论是在 OLE DB 源编辑器中 还是在执行 SQL 任务中 我的 SQL 语句中一定缺少一些东西 因为我不断收到
  • HTML5 Canvas 在绘图时闪烁

    我从一个等距游戏开始 当绘制地面的所有部分时 我的画布正在闪烁 不在 IE 中 当我将 fps 设置为 20 或更低时 闪烁停止 我该如何解决这个问题 有任何想法吗 var camerax 300 cameray 100 var fps 6
  • 如何解决 Xcode 上 Storyboard 的警告? [复制]

    这个问题在这里已经有答案了 Trailing Leading constraint is missing which may cause overlapping with other views 我的故事板 只需放置 2 个标签及其约束 避
  • ui:repeat 不适用于 f:selectItem

    我正在使用 Icefaces 选择菜单从用户列表中选择用户 我想为每个用户重复 selectItem 这是我尝试过的
  • 您的实用工具包中有什么? [关闭]

    Closed 这个问题不符合堆栈溢出指南 目前不接受答案 我认识的一些最高效的工程师 开发人员和 IT 专业人员通常都会携带一个由有用程序 插件或实用程序组成的通用 工具包 以帮助他们进行日常调试 开发或设计 问题是 您的实用工具包中有什么
  • 如何在 Visual Studio 2008 中添加 ASP.NET 的页面事件

    这是一个 Visual Studio 问题 我觉得所有有用的智能感知应该有一些帮助 但我似乎找不到它 我在 VS2008 中用 ASP NET C 制作了一个带有代码隐藏的页面 当然它会自动生成 PageLoad 事件方法 那么 如果我想为
  • rjava .jcall 问题

    我目前正在开发一个 R 包以将 java 代码集成到 R 中 但是 我在尝试正确调用 java 类方法时遇到问题 到目前为止我已经独立开发了一个java程序并编译成class文件 然后打包为jar文件 我的代码示例如下 library rJ
  • 在Android中设置每天在特定时间重复闹钟

    我正在使用闹钟管理器在每天的特定时间运行闹钟 下面是代码 Calendar calendar Calendar getInstance calendar setTimeInMillis System currentTimeMillis ca
  • 使用 epoll 进行非阻塞 tcp 连接

    我的 Linux 应用程序正在执行非阻塞 TCP 连接系统调用 然后使用epoll wait检测三向握手完成 有时epoll wait两者都返回POLLOUT POLLERR为同一套接字描述符设置的事件 我想了解 TCP 级别发生了什么 我
  • uisearchDisplayController:更改标签“无结果”

    使用 uisearchDisplayController 时如何更改标签 无结果 Regards 我已经成功删除了标签 因为从来没有空结果集 如果因为从服务器获取而没有结果 请将数据源重置为单行 并让它显示空白的表视图单元格 此外 使用逻辑
  • 为什么我在尝试检查偶数/奇数时会收到“类型错误:字符串格式化期间未转换所有参数”?

    这段代码给出了一个错误 print type a whole number n input if n 2 1 print Odd else print Even 我假设我必须对 if 语句中的变量 n 做一些特殊的事情 我是 Python
  • simple_form的collection_radio_button和自定义标签类

    我正在尝试使用 FontAwesome 制作带有无线电集合的星级评级表格 为此我实际上需要更改 simple form 生成的 collection radio button 输入的标签类 但找不到任何明显的解决方案 到目前为止我使用 fo
  • GLM 如何处理翻译

    OpenGL 数学库 GLM 使用以下算法来计算平移矩阵 taken from source code template
  • 如何在Dataset中存储自定义对象?

    根据Spark 数据集简介 在我们期待 Spark 2 0 的同时 我们计划对数据集进行一些令人兴奋的改进 具体来说 自定义编码器 虽然我们目前自动生成各种类型的编码器 但我们希望为自定义对象开放 API 并尝试将自定义类型存储在Datas
  • 在 core-site.xml 中设置 fs.default.name 将 HDFS 设置为安全模式

    我以伪分布式模式在单台机器上安装了 Cloudera CDH4 发行版 并成功测试了它是否正常工作 例如可以运行 MapReduce 程序 在 Hive 服务器上插入数据等 但是 如果我碰巧core site xml文件有fs defaul
  • JobIntentService onComplete 发生崩溃

    我收到以下 Android 8 的崩溃报告 但我找不到原因或解决此问题 java lang IllegalArgumentException Given work is not active JobWorkItem id 1 intent
  • Angular 2错误:加载块多次失败

    我在服务器上部署了 Angular 2 应用程序 该应用程序运行良好 此外 我还记录角度应用程序的错误 以便我可以解决它们并使我的应用程序更加稳定 我不断得到Loading chunk failed error Error Uncaught
  • 在 javascript 中选择 OOP 模式

    我在其他人的帮助和一些资源的帮助下将这些放在一起 我做了一个一切的小提琴 下面发布了精简的代码 基本上我已经学会了如何使用这些模式 但我很好奇这些方法之间更根本的区别 下游代码实际上与这些模式中的任何一种都相同 但是除了个人偏好之外 是否有