从静态方法调用ES5类方法

2023-12-28

我想从没有实例的静态函数中调用内部函数,如下所示:

Foo.Bar = function (options) {

    Autodesk.Viewing.Extension.call(this, options);

    ...

    this.innerFunc = function innerFunc(){
      ...
    }
};

Foo.Bar.prototype.constructor =
    Foo.Bar;

Foo.Bar.SomeStaticFunc = function () {
    innerFunc();
}

Use: Foo.Bar.SomeStaticFunc();.

但我得到SomeStaticFunc is not a function.

这个例子here https://abdulapopoola.com/2013/03/30/static-and-instance-methods-in-javascript/使用类的变量,例如var Foo.Bar = function (options) {...但这不是与像这样创建类的实例并调用内部函数一样吗?

let x= new Foo.Bar(options);
x.innerFunc();

还有其他方法可以做到这一点吗?

PS:我了解 ES6 类,但我现在不想将此类迁移到 ES6,因为它并不完全简单。


嗯...看来您不知道 JavaScript 内部是如何工作的,所以这里是一个快速回顾。 :)

  • JavaScriptIS面向对象的语言。对象字面量是对象,数组是对象,函数是对象,等等。

  • JavaScriptIS NOT基于类的语言。你可以说:“嘿嘿,我见过class and extendsES6 中的关键字!”。是的,但这只是语法糖。JavaScript 不像 Java 那样基于类,它基于原型.

使用 ES5 语法,有两种方法来创建所谓的“类”:

  • 对象字面量
  • 构造函数

当您使用对象文字时,您的类如下所示:

var myClass = {
  myAttribute: "foo",
  myMethod: function () {
    return "bar";
  }
};

当您使用构造函数时,您的类如下所示:

function MyClass() {
  this.myAttribute = "foo";
  this.myMethod = function () {
    return "bar";
  };
}

这两种方法当然存在差异。有了对象字面量,你就有了一种单例,其中属性在某种程度上都是静态的。使用构造函数,您可以生成实例,其属性将由this关键词。例子:

var myInstance = new MyClass();
console.log(myInstance);

该实例将包含“myAttribute”和“myMethod”自己的财产。这意味着这些属性与实例相关联。如果你想调用这个方法,你必须这样做:

myInstance.myMethod();

到目前为止一切顺利...但是我们之前所做的有一些问题。this.myMethod将为每个实例一次又一次地创建MyClass而且总是一样的。处理这个问题的更好方法是将其放入原型以便所有实例可以共享它:

function MyClass() {
  this.myAttribute = "foo";
}

MyClass.prototype.myMethod = function () {
  return "bar";
};

这好多了,但是myMethod仍然与MyClass实例...

现在我想创建一个静态方法。根据定义,我们的静态方法将绑定到类,而不是它的实例:

MyClass.myStaticMethod = function () {
  return "baz";
};

好的。在这里,为了实验的目的,我想做这样的事情:

MyClass.myStaticMethod = function () {
  myMethod();
};

这是行不通的。为什么?实际上,myMethod既不存在于给定范围内,也不存在于外部范围内。myMethod已在另一个函数(构造函数)内声明并且不返回,因此从外部是不可见的。而且这个函数已经被放到了原型中MyClass。这意味着它在全局范围内不可用,而仅在实例上可用MyClass。当你仔细想想,这是非常合乎逻辑的。例如,当你想调用数组方法(Array.prototype 中的方法)时,这样做是没有意义的:

push('test');
reverse();
includes('a');

您必须在数组(数组实例)上调用这些方法。

[].push('test');
['foo', 'bar', 'baz'].reverse();
['a', 'b'].includes('a');
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从静态方法调用ES5类方法 的相关文章

  • 如何将创建的抽认卡保存到本地存储?

    我正在制作一个小项目 您可以在其中制作抽认卡 这些抽认卡填充具有 网格卡 类的 div 内的网格 在我的 Codepen Javascript 代码的最底部 您可以看到我尝试将所有创建的抽认卡保存到 localStorage 这样当用户刷新
  • 使用 React js 和 Express API 服务器通过 fetch 发布对象

    我在 fetch 中的 post 方法遇到麻烦 因为我的服务器从客户端接收到一个空对象 我已经检查了客户端 但无法发送我想要发送的值 这是我的服务器 const express require express const app expre
  • 为什么“true && () => {}”会产生“Uncaught SyntaxError:格式错误的箭头函数参数列表”? [复制]

    这个问题在这里已经有答案了 下面的代码 执行时 true gt yields Uncaught SyntaxError Malformed arrow function parameter list Why 编辑 我知道将函数包装在括号中是
  • 使用正则表达式验证字符串是否安全

    我有一个网站 用户可以在其中选择用户名 目前 他们可以输入几乎任何字符 包括 ETC 我知道我可以使用正则表达式 这可能就是我的选择 我将使用否定集 我认为这是正确的工具 如下所示 那么 我怎样才能知道要放入该集合中的所有非法字符呢 我可以
  • 使用 fadeIn() 时,jQuery“未捕获类型错误:未定义不是函数”;

    我是 JS 新手 正在编写一个基本的富含 jQuery 的网页 其中同一文档中的每个页面都具有淡入 淡出功能 使用具有单独 ID 的相同 div 元素 无论如何 当我尝试淡入当前页面时 我收到错误 未捕获的类型错误 未定义不是函数 我在网上
  • 通过单击堆叠条形图打开选项卡

    我正在使用 R 构建一个包含转发的堆积条形图 ggplot and plotly 如果单击条形图的一部分 我希望打开一个新的浏览器选项卡并显示该特定日期的推文以及指定的转发量 但是 当我单击下面示例中的其中一个栏时 会打开一个不同的链接 表
  • 在 JavaScript 中解析日期时间字符串

    有谁知道如何解析所需格式的日期字符串dd mm yyyy See Mozilla Core JavaScript 参考 日期对象 https developer mozilla org en Core JavaScript 1 5 Refe
  • 仅当 url 以 www 为前缀时才会发生 CORS 错误

    我目前遇到一个关于 CORS 跨源资源共享 的问题 奇怪的是 只有当我使用 www url 前缀时 才会出现这种情况 例如 当我使用以下网址访问我的网站时 http example com index http example com in
  • YouTube - 右键单击​​时不显示上下文菜单

    想法 通过使用右键拖放到视频播放器上来查找 YouTube 视频 例如 每 2 屏幕宽度 1 秒 因此 在 1920x1080 的屏幕上 如果我按下鼠标右键 将其向左拖动 384 像素 20 然后松开 视频应该快退 10 秒 我有一个 Gr
  • 单击元素外部时触发事件的指令

    我知道有很多问题都在问类似的事情 但没有人真正解决我的问题 我正在尝试构建一个指令 当鼠标单击当前元素外部时 该指令将执行表达式 为什么我需要这个功能 我正在构建一个应用程序 在这个应用程序中 有 3 个下拉菜单 5 个下拉列表 如选择的
  • 在 forEach() 中使用 `this` [重复]

    这个问题在这里已经有答案了 免责声明 我正在学习 JavaScript 我有一个像这样的对象构造函数 var Palette function this colors red green blue this getColorCombinat
  • 如何检查字符串中是否存在阿拉伯字符(javascript)

    如何用javascript语言检查字符串中是否存在阿拉伯字符 根据维基百科 http en wikipedia org wiki Basic Multilingual Plane 阿拉伯字符属于 Unicode 范围 0600 06FF 因
  • 将 JSON 字符串传递给 Django 模板

    我一直在用头撞墙 试图找出为什么我无法将从 Django 模型生成的 JSON 字符串传递到模板的 javascript 静态文件中 事实证明 问题不在模型级别 使用serializers serialize 在脚本本身中放入相同的字符串将
  • jQuery 删除函数真的删除 Dom 元素吗?

    我真的想知道 jQuery 是否remove http api jquery com remove 函数确实从 DOM 中删除元素 首先 我看了here https stackoverflow com questions 2185760 j
  • AngularJS 与(Angular JS + jQuery)

    我有一个关于仅使用 AngularJS 和纯 JavaScript 以及使用 AngularJS 和 jQuery 时的性能问题 ex app directive fitHeight function window return restr
  • 使用 System.js 导入 Typescript 编译的模块时出错

    我最近正在学习使用 system js 导入由 Typescript 编译的模块 这些模块之前是为 require js 编译的 并且工作正常 但是合并到system js时 应用时无法导入模块系统生产 js 控制台说 Uncaught i
  • queue.js 是如何工作的?

    我一直试图理解如何Mike Bostock 的queue js https github com mbostock queue blob master queue js有效 但我看不出它是如何工作的 我不明白的部分是代码如何设法继续执行回调
  • 在成功回调之前修改 JSONP 结果

    我想从外部服务加载一些 JSON 数据 然而 它提供 foo bar useful 而我真正关心的是 有用 的部分 我需要将那部分传递给success打回来 我正在尝试使用Deferred一次从多个数据源加载 类似this https st
  • 在 Mobile Safari 中点击

    敲击
  • 如何从 vue 组件调用 App.vue 中的方法

    我有一个 vue 组件和一个 vue 元素声明 如下所示 Vue component todo item template li This is a todo li methods test function I am getting an

随机推荐

  • 梯度检查到底是什么?

    我是深度学习的初学者 我想到了 梯度检查 的概念 我只是想知道它是什么以及它如何帮助改进培训过程 为什么我们需要梯度检查 反向传播作为一种算法有很多细节 并且实现起来可能有点棘手 一个不幸的特性是 有很多方法可以在后支撑中产生微妙的错误 因
  • Ninject 到动作过滤器中

    我创建了一个自定义操作过滤器 并将其与 Ninject 的 BindFilter 方法绑定 public class ExtendModelAttribute FilterAttribute public class ExtendModel
  • 如何在 Laravel 4 中的路由组上应用多个过滤器?

    Goal 我想使用 Laravel 4 中的路由过滤器Route group and Route filter 描述 我有两种类型的用户 内部的 经销商 For Internal 我有 2 组 admin regular For Distr
  • ASP.NET 应用程序转到 500.21 ...直到 IIS 重置 + 清除临时 ASP.NET 缓存

    我们在 QA 实验室中看到了一种奇怪的模式 我们有两个 ASP NET 应用程序 每个应用程序都部署在同一个 Windows 2008 SP2 机器上 我们的应用程序池在域帐户中运行 并设置为永不回收 两个应用程序使用相同的 1 个应用程序
  • Facebook 建议忽略 og:title 直到页面刷新

    我有 Facebook 推荐按钮的典型 HTML5 实现 div div
  • 不同与分组哪个更好

    最简单的情况我们都参考 select id from mytbl group by id and select distinct id from mytbl 正如我们所知 它们生成相同的查询计划 该计划在某些项目中反复提到 例如哪个更好 不
  • 循环遍历所有 MDI 子窗体并关闭除当前窗体之外的所有其他窗体

    我正在使用 C 开发 winforms 应用程序 我有一个 MDI 容器 左侧有一个菜单 按下按钮即可看到相应的表单 如果我单击打开 Form1 的按钮 3 次 则会打开该表单的 6 个实例 因此我认为我必须编写一个方法来处理任何其他 Fo
  • 在字符串中查找字母,后面不跟数字...可能使用 RE?

    我试图从字符串中提取字母 这些字母后面不跟着数字 或者后面不直接跟数字 这是一个示例字符串 string ts0060 LOD 70234 lr2 billboards rgba over s3d lf v5 2Kdciufa lnh 这是
  • Angular2 防护在页面刷新时不起作用

    在每次请求之前 我想确保有可用的用户配置文件 我使用 canActivateChild 防护来执行此操作 根据 angular2 的文档 可以返回一个可观察的 https angular io api router CanActivateC
  • 使用 Windows 7 从 IPython 复制到剪贴板

    我在 Windows 7 上运行 IPython 并且可以使用 paste从剪贴板粘贴的魔术命令 但是 我无法从 IPython 复制到剪贴板 我想从 IPython 复制代码片段并将其粘贴回文本编辑器 有人知道解决这个问题吗 Found
  • Android 片段和活动

    参考下图 http developer android com guide components fragments html http developer android com guide components fragments ht
  • 已删除对“{where: '原始查询'}”的支持

    我正在 AWS Lambda 上使用无服务器框架运行 GraphQL 服务器 我正在使用 UI 中获取数据apollo link batch http 如果我使用本地运行它serverless offline 效果很好 但如果我在 AWS
  • 在 C# 中使用动态访问匿名类型的字段 - 可能吗?

    我有一个控制器方法 public JsonResult CalculateStuff int coolArg if calculatePossible return Json CoolMethod coolArg else return J
  • 角度表行包含使用反应形式动态动态列的总和

    我正在 Angular 项目中工作 我想显示一个包含两列和动态行的表格 当用户输入任何数字时 最后一行包含每列的总和 这就是我想要实现的目标 element FR EN elem A elem B elem C Total 这是我的角度代码
  • 使用 QPixmap 的 Qt 内存泄漏

    我在这段代码中的某个地方遇到了奇怪的内存泄漏 该方法是连接到另一个线程中的方法的 SLOT 它做了两件事 1 它用另一个线程所在的迭代更新文本框 2 它将 GUI 上显示的图像更新为与该迭代相对应的图像 它在 10 30 次迭代中效果很好
  • 制作一个遍历 2 个容器的 C++ 迭代器

    我需要一个具有如下功能的 容器 它有 2 个子容器 称为 A 和 B 我需要能够迭代 A B 以及 A 和 B 的组合 我不想为冗余数据使用额外的空间 所以我想到制作自己的迭代器来迭代 A 和 B 的组合 制作自己的迭代器的最简单方法是什么
  • 如何显示最初从plist iphone隐藏的状态栏

    我想在启动应用程序时隐藏状态栏以查看状态栏覆盖的启动图像 所以在 plist 中我添加了 Status bar is initially hidden YES 并且状态栏被覆盖 我的问题是状态栏始终在我的应用程序中被覆盖 我只想隐藏启动图像
  • 如何从一种 Fortran 整数类型转换为更小的整数类型?

    我需要将参数从integer kind 8 to integer kind 4 在 Fortran 中 有什么 简单的 方法可以做到这一点吗 这个参数是一个输入数字 如果这个数字大于2 31 1 4字节整数的限制 程序将总是要求一个更小的数
  • 通过 RedirectAction 传递 Model 为 null

    在我的主控制器中切换视图时 我只是从控制器调用另一个操作 但是我传递的模型在传递后为空 并且事先不为空 public ActionResult Index ViewModelViewImages model return RedirectT
  • 从静态方法调用ES5类方法

    我想从没有实例的静态函数中调用内部函数 如下所示 Foo Bar function options Autodesk Viewing Extension call this options this innerFunc function i