在函数内部创建方法

2023-12-02

我正在尝试在函数内创建方法。我可以这样做:

function sample() {};
sample.show = function() { alert() };

我会看到警报呼叫sample.show();。但出于代码美化的原因,我想将所有方法声明移至函数内。我尝试过:

function sample() {
    sample.show = function() { alert() };
}

但我得到:TypeError: Object function sample() has no method 'show'我尝试过的另一种方法:

function sample() {
    this.show = function() { alert() };
}
function sample() {
    sample.prototype.show = function() { alert() };
}
function sample() {
    this.prototype.method = function show () { alert() };
}

但结果是一样的。我什至找不到任何有关在函数内部创建方法的信息。你能给我指出正确的方法吗?

UPD: 我想要有打电话的能力sample()函数也做了一些事情。所以目前还没有答案。

function sample() {
    this.show = function() { alert() };
    console.log('you called "sample()"');
}
sample(); // ==> you called "sample()"

第一次尝试:

function sample() {
    sample.show = function() { alert() };
}

这只会在sample函数并且只有在执行它之后

console.log(sample.show);
//would show undefined on the console
sample();
console.log(sample.show);
//would then show the method definition as it has now been
//defined as a property of "sample"

第二次尝试:

function sample() {
    this.show = function() { alert() };
}

仅当您创建示例实例时这才有效

console.log(sample.show);
//will print undefined as there is no property "show" on sample
sample();
console.log(window.show);
//will print the function, but since sample was executed without a
//context, show is created as a property of the global object
//in this case "window"
var d = new sample();
console.log(d.show);
//will print the function as we now have a instance of sample which
//show was made a property of
console.log(sample.prototype.show);
//will show undefined as you are not actually creating the "show" method
//on the constructor sample's prototype

现在有了原型版本:

function sample() {
    sample.prototype.show = function() { alert() };
}

有了这个之后,您将能够通过实例或原型链访问“show”方法,但是为了使原型链调用正常工作,您必须至少事先创建一个实例

console.log(sample.prototype.show);
//will print undefined as "show" has not been defined on the prototype yet
var d = new sample();
console.log(d.show);
console.log(sample.prototype.show);
//Both will now print the function because the method has been defined

然而最后一个:

function sample() {
    this.prototype.method = function show () { alert() };
}

根本不起作用,因为您无法直接从实例访问原型,一旦尝试创建实例,您将收到未定义的错误。

为了让它工作,你必须通过构造函数链来设置方法

function sample() {
    this.constructor.prototype.method = function show () { alert() };
    //is the same as doing
    sample.prototype.method = function show(){ alert() };
}

所以总的来说,为了让你的“美化”发挥作用,你必须打电话sample首先,要么直接为第一个,要么为其他创建一个实例。

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

在函数内部创建方法 的相关文章

随机推荐

  • jQuery 加载文本文件数据

    我正在尝试使用外部脚本文件中的 get 函数从服务器上的文本文件加载数据 我的代码如下 Load sample date var stringData get http localhost webpath graphing sample d
  • Node JS 中的 JSON stringify 未序列化对象数组

    我在用sails js 节点js框架 我正在尝试对其中一个对象进行 JSON stringify 但是当我这样做时 它会忽略其中一个字段 下面的 rooms 数组 这是 console log object 给我的 rooms Object
  • Selenium ChromeDriver 目前是否支持处理弹出窗口?

    单击 Chrome 浏览器上的按钮后 我必须处理一个弹出窗口 一旦以编程方式启动弹出窗口 驱动程序对象的任何进一步操作都会导致此异常 OpenQA Selenium WebDriverException 服务器没有对 url 做出响应 窗口
  • 关于 ArangoDB 中多个索引的使用

    具有以下结构的文档 path String enabled Long disabled null Long other fields 我想通过路径前缀和某些数字与文档时间戳之间的数字关系的组合来查找文档 伪代码 SELECT e FROM
  • 在居中的动态宽度父级中左对齐子级

    我有点无法理解它 而且也很难在网络 此处找到正确的解决方案 因为它很难制定 基本上我想要的是像左对齐图像的居中对齐 所以它应该是一个居中的动态宽度父div 宽度取决于浏览器宽度 它保存带有在一行中呈现的图像的div 但新行应该左对齐 我可以
  • CardView 海拔高度不适用于 Android 5.1.1

    我在 RecyclerView 中使用 CardView 经过大量阅读后 我最终只在 Android 5 1 1 上遵循 不工作 代码 在之前的 Android 版本上 它运行良好
  • SoftLayer 通过 userStatusID 获取用户

    我正在尝试检索SoftLayer 用户配置文件通过用户状态 ID 我正在使用网址
  • Discord.js v13 语音通道数据未更新

    我的 Slash 命令已注册 但它们出现不一致 我的用法的简化版本 client on interactionCreate async interaction gt if interaction isCommand return conso
  • 如何创建输出自定义类型的 Swift Regex?

    In the 全球开发者大会视频 结果表明你可以这样做Captures TryCapture正则表达式生成器中的 s let regex Regex TryCapture OneOrMore digit transform Int 0 和输
  • 在 Android 中嵌入 Knopflerfish 不起作用

    我正在尝试将 Knopflerfish 框架嵌入到 Android 应用程序中以动态加载和卸载包 我跟着this教程 我做的第一步是从下载framework jarthis链接 并将其添加到我的 Eclipse 项目中的类路径中 另外 下面
  • Titanium - Android 外部存储 - 创建新目录,然后将文件写入其中

    我们是否不能简单地以编程方式在 Android 的外部 SD 卡 而不是设备的内部存储器 上创建新目录 并且我们不能在 SD 卡上写入文件 Titanium 是否受到如此限制 即使在使用后也始终在内部存储器上写入文件Ti Filesyste
  • 直线与 AABB 矩形相交?

    最好不使用任何类型的循环 因为这将在游戏中使用 我希望将一条线与任意大小的矩形相交 但我也希望返回交点 有可能 我已经做了一些谷歌搜索 但仍然没有解决 该线使用 x1 y1 x2 y2 定义 矩形也有这两点 我建议简单地对构成矩形的每个线段
  • 可变参数模板参数总是必须放在最后吗?

    我是否总是必须将可变参数模板参数放在模板参数的末尾 template
  • 空手道框架 - 如何检查比赛中的条件 OR 包含响应

    作为示例 我尝试使用匹配包含来验证我的架构响应和数据类型 有时它返回 null 有时它会返回字符串 我正在尝试以下操作 但断言失败 因为它的计算结果不为 true 我正在尝试以下操作 match each response data Res
  • 表单中的条件字段

    我需要创建一个 Form 类 该类可能有或没有 ReCaptcha 字段 具体取决于用户是否登录 因为这是一个 CommentForm 所以我无权访问request表单创建 定义上的对象 所以我不能依赖它 For the POST请求解决方
  • 电子邮件触发 PHP 脚本...可能吗?

    我需要根据我控制的电子邮件帐户设置自动回复trigger words在电子邮件正文中 而且 它还需要根据发送到此电子邮件帐户 属于我的网站 的触发词从数据库表中添加 删除行 并且在某些情况下 如果发送到一个论坛 则需要在论坛内创建一个主题
  • 在 Swift 中从 NSString 创建 NSData

    我试图最终拥有一个NSMutableURLRequest具有有效的HTTPBody 但我似乎无法获取我的字符串数据 来自UITextField 转化为可用的NSData object 我见过这种方法可以用另一种方式 NSString dat
  • Facebook 博主的开放图标签 - OG 图像太小。我可以指定全尺寸图像而不是缩略图吗?

    Blogger 不允许您在每个帖子中指定开放图形图像 目前 模板中有一段代码指定自动生成的缩略图作为facebook的开放图图像 问题是 缩略图是 72 72 而 Facebook 现在要求 OG 图像的宽度至少为 200px 否则默认为页
  • Pyinstaller 在 python 3.7 中不起作用(找不到模块“编码”)

    我有下面的测试程序 我用 pyinstaller Python 版本 3 7b Windows 10 64 位 编译代码 在编译和错误期间注意到警告 我将不胜感激任何解决这个问题的见解 Test py import encodings pr
  • 在函数内部创建方法

    我正在尝试在函数内创建方法 我可以这样做 function sample sample show function alert 我会看到警报呼叫sample show 但出于代码美化的原因 我想将所有方法声明移至函数内 我尝试过 funct