在 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 模式 的相关文章

  • javascript中如何无限循环

    我尝试使用 0 到 100 和 100 到 0 之间的 while 进行无限循环 但浏览器崩溃了 有没有办法清除浏览器内存 这是我的代码 var a 0 var flag true while true if a lt 100 flag t
  • 如何在 AngularJS 中使用 $timeout 运行带有参数的函数?

    我的 AngularJS 控制器中有这个函数 看起来像这样 polling interval 1000 var poll function Execution code timeout poll polling interval poll
  • Yeoman-Angular 生成的应用程序中缺少 Angular 脚本

    我已经使用 Yeoman Angular Generator 生成了一个应用程序 但项目中缺少 angular js 和其他 Angular 文件 我可以在 Bower json 文件中看到这些依赖项 如下所示 name mi portfo
  • angularjs 自定义过滤器检查数据数组内的值

    我有两个过滤器 它们根据数据中的队列键过滤数据 这是我的代码 var app angular module app app controller mainController function scope Data object scope
  • Jqplot 中两个系列数据的不同颜色条

    我想知道如何在 Jqplot 中为两个系列制作不同的颜色条 如果我只有一个系列数据 它的工作原理如下图所示 红色和绿色基于其值 但是 如果我有两个系列数据 我无法为每个系列数据配置两个系列颜色 目前我只能做这个图 我希望两个系列图可以根据其
  • Object.assign() - 奇怪的行为需要解释

    我有这个代码 function margeOptions options passedOptions options Object assign options passedOptions let passedOpts a true let
  • 尝试使用 angularJS 和 c# webapi 从服务器下载文件

    将文件上传到服务器时效果很好 没有损坏的文件 但是 当我下载文件时 除了纯txt 它们起作用 它们的规模不断扩大并变得腐败 经过大量调查后 我不知道可能出了什么问题 我只是写文件 作为响应流并下载 blob 欢迎任何想法 严重依赖此线程来解
  • 使用shinyjs通过javascript在闪亮的应用程序中操作现有的Leaflet地图

    我有一个闪亮的应用程序 其中包含现有的传单地图 我希望能够在渲染后使用自定义 javascript 通过shinyjs包裹 一个最小的例子如下 app R packages library dplyr library leaflet lib
  • 将参数传递给 jquery 单击事件中的回调函数[重复]

    这个问题在这里已经有答案了 直接进入正题 我有一个 jquery 事件监听器 如下所示 number click printNumber 和一个回调函数 function printNumber number console log num
  • TypeScript 中类和命名空间的区别

    到底有什么区别classes and namespaces在打字稿中 我知道 如果您创建一个带有静态方法的类 您可以在不实例化该类的情况下访问它们 这正是我猜想的命名空间的要点之一 我还知道你可以创建多个同名的命名空间 并且它们的方法在编译
  • 如何在 Jest 测试中模拟 StatusBarManager.getHeight?

    我正在使用 expo 34 并且反应本机用户界面库 https www npmjs com package react native ui lib来自 wix 并且在为我的组件设置笑话测试时遇到问题 问题看起来出现在link https g
  • 为什么 JSON.stringify() 接受 Date 对象?

    至少在 Firefox 中 您可以对 Date 对象进行字符串化 gt gt gt JSON stringify now new Date now 2012 04 23T18 44 05 600Z 这是有效的 因为 在 Firefox 中
  • jQuery UI 对话框使用 setTimeout 自动关闭

    我试图让对话框在打开后三秒自动关闭 我尝试过以下方法 setTimeout mydialog dialog close 3000 这是在上下文中 acknowledged dialog dialog height 140 modal tru
  • 函数声明或函数表达式

    我刚刚在块作用域中定义函数时遇到了问题 考虑以下程序 try greet function greet alert Merry Christmas catch error alert error 我希望这个程序能够发出警报Merry Chr
  • 从 UnityWebGL jslib 返回字符串

    我想使用 jslib 来获取网址参数 像这样的代码 jslib GetUrl function var s var strUrl window location search var getSearch strUrl split var g
  • 检测 JavaScript 中的焦点丢失

    我希望能够检测 JavaScript 中任意元素何时失去焦点 因此我可以构建一个类似于 jEdit 的内联编辑工具 我不能依赖 jQuery 来实现这个库 所以我需要一个本机方法来完成它 我查看了 onblur 这似乎是正确的事情 但 MD
  • Niceedit本地上传图片失败

    我是这样称呼编辑的 new nicEditor buttonList bold italic underline upload iconsPath img nicedit png uploadURI http server com inte
  • 如何在 Astro 中的组件之间共享状态?

    我相信我在代码中采用了错误的方法 如何在按钮单击中设置客户端首选项 该按钮单击用作全局 astro 组件中的道具 或者我应该怎么做 我知道这是可能的 因为 astro js 本身在他们的文档网站中这样做了 下面是我的尝试的解释 我目前正在开
  • 如何制作饼图聚合数据源?

    Using 适用于 ASP NET MVC 的 Kendo UI 完整版 http www kendoui com 版本 2013 3 1119 2013年11月20日 如果我有这段代码 status chart kendoChart da
  • ES6解构对象赋值函数参数默认值

    您好 我正在查看在传递函数参数时使用对象解构的示例对象解构演示 https developer mozilla org en US docs Web JavaScript Reference Operators Destructuring

随机推荐

  • 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 模式

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