高级 Javascript:检测当前函数是否被构造函数调用

2024-01-04

在 Javascript 函数中,可以相当简单地检测该函数是否已简单执行或作为对象实例构造函数执行(使用new关键词)。

// constructor
function SomeType() {
    if (this instanceof SomeType)
        // called as an object instance constructor
    else
        // the usual function call
}

没关系,这个问题已经在 SO 上至少回答过几次了。

因此,现在让我们假设我们的构造函数调用我直接在 Function 原型上定义的另一个函数,因此所有函数都可以访问它 - 这是我这样做的主要目的。

Function.prototype.doSomething = function doSomething() {
    // what code here?
};

// constructor
function SomeType() {
    SomeType.doSomething();
}

主要问题

我们现在如何检测内部doSomething同样对于SomeType功能?

我想检测它的原因是我正在编写一个函数adopts/injects构造函数参数与构造对象实例成员同名。当然,这个函数应该只在被构造函数调用时执行,而不是被定期调用的函数调用时执行。

这是我的答案 https://stackoverflow.com/a/27838697/75642到另一个问题,你可以在其中看到我的adoptArguments将对象构造函数参数作为成员放入构造对象实例中的函数。

强制执行特定用法的解决方法=不好

我有一个可能不想使用的解决方法,因为它强制执行正确的用法 - 执行上下文注入。这是可以检测对象实例构造函数执行的代码:

Function.prototype.doSomething = function doSomething() {
    if (this instanceof doSomething.caller)
    {
        // object instance construction
    }
    else return; // nope, just normal function call
};

// constructor
function SomeType() {
    // required use of ".call" or ".apply"
    SomeType.doSomething.call(this);
}

这个想法可能会激发你自己的一些想法来解决最初的问题


在 Javascript 函数中,可以相当简单地检测该函数是简单执行还是作为对象实例构造函数执行(使用 new 关键字)。

其实这是不可能的,一无法知道 https://stackoverflow.com/q/367768/1048572JS 中是否将用户函数作为构造函数调用。这this instanceoftest 对于通常情况来说已经足够了,但只检查上下文是否继承自类的原型。

我们现在如何检测内部doSomething同样对于SomeType功能?

你不能出于同样的原因,你也不能这样做instanceof测试未通过this作为你的参数doSomething.

主要问题:我正在编写一个函数,该函数采用/注入构造函数参数作为具有相同名称的构造对象实例成员。

我建议不要通过构造函数内的函数调用来执行此操作。相反,尝试装饰构造函数,以便您可以立即访问所需的所有值:

Function.prototype.adoptArguments = function() {
    var init = this;
    var args = arguments.length ? arguments : init.toString().replace(comments, "").match(argumentsparser);

    if (!args || !args.length) return init;

    var constructor = function() {
        if (this instanceof constructor) {
            for (var i=0; i<args.length; i++)
                this[args[i]] = arguments[i];
            init.apply(this, arguments);
        } else {
            // throw new Error("must be invoked with new");
        }
    };
    return constructor;
};

然后代替

function SomeType() {
    SomeType.adoptArguments();
}

do

var SomeType = function() {

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

高级 Javascript:检测当前函数是否被构造函数调用 的相关文章

随机推荐

  • Apache Spark 在内存中如何工作?

    当在 where 子句中使用非索引列查询 Cassandra 时 Spark Cassandra Connector 的官方文档 https github com datastax spark cassandra connector blo
  • pyqt QFileSystemModel rowCount

    我看过有关 QFileSystemModel rowCount 未按预期工作的帖子 ex1 https stackoverflow com questions 33544645 qfilesystemmodel rowcount does
  • document.write 是否阻塞

    我想以阻塞方式将脚本插入页面 不幸的是 无法使用脚本标记的 src 属性 如果我在所有浏览器上通过 document write 插入标签 它会阻塞吗 我知道这是一种不好的做法 但我确实需要它来阻止其他资源的加载 目前我正在做 docume
  • iOS9 - 分享到 Instagram(带钩子)不起作用

    我目前正在更新我的一款应用程序以兼容 iOS9 但在分享到 Instagram 功能时遇到问题 我正在使用 Instagram hooks 如他们的开发者网站上所述 https instagram com developer mobile
  • 重读 Lucene TokenStream 时遇到问题

    我正在使用 Lucene 4 6 并且显然不清楚如何重用 TokenStream 因为我得到了异常 java lang IllegalStateException TokenStream contract violation reset c
  • 将字符串文字添加到 static_assert

    有没有办法结合 static assert 的输出 我的意思是这样的 template
  • v4l2_buffer->timestamp值从哪里开始计数?

    我正在尝试使用 v4l2 buffer 的时间戳值 类型 timeval 来同步从UVC网络摄像头到外部事件 但是时间戳与系统时间或正常运行时间等不同 printf image captured at ld ld n buffer gt t
  • IE8和JQuery的trim()

    我正在像这样使用trim if group field val trim Where group field是文本类型的输入元素 这在 Firefox 中有效 但当我在 IE8 上尝试时 出现以下错误 Message Object does
  • Spring Data MongoDB 和allowDiskUse

    我有一个这样的查询 db tqaP aggregate match and eventUTCDate gte 01 10 2014 eventUTCDate
  • Android 浏览器意图后退按钮

    您好 我正在使用以下意图从我的应用程序启动浏览器 String url XXXX Intent i new Intent Intent ACTION VIEW i setData Uri parse url startActivity i
  • 什么时候使用 hr 元素在语义上是正确的?

    The HTML5 参考 http dev w3 org html5 html author the hr element说 hr 元素代表段落级主题中断 例如故事中的场景变化 或参考书中某个部分中到另一个主题的过渡 这个描述对我来说还不够
  • x32 与 x64 的库名称

    我有一个支持 x32 和 x64 平台的 C 静态库 我的问题是 我应该根据哪个平台对 lib 文件命名不同吗 即 MyLib32 lib 与 MyLib64 lib 英特尔数学库和 TBB 使用文件夹名称来区分这两个库来处理此问题 即 x
  • jQuery 和 CSS 媒体查询之间的窗口宽度不一致

    我在这里得到了一些奇怪的结果 我不太明白 在 jQuery 中 我通过以下方式记录窗口宽度 console log window width 在我的 CSS 中 我将背景颜色更改为红色 media only screen and min w
  • 在python中从网上下载excel文件

    我有以下网址 dls http www muellerindustries com uploads pdf UW SPD0114 xls 我尝试下载该文件 urllib2 urlopen dls test xls 这创建了一个名为 test
  • OpenGL 旋转 2D 纹理

    UPDATE 更新见底部 我在互联网上查找了很多 发现了一些教程来解释我想要实现的目标 但我无法让它工作 要么教程不完整 要么不适用于我的代码 我正在尝试一些简单的事情 例如围绕其原点 中心 旋转二维图像 我使用 xStart xEnd y
  • 如何计算 Pandas 中列的成对相关性的 p 值?

    Pandas 有一个非常方便的函数 可以使用以下方法对列进行成对相关 pd corr https pandas pydata org pandas docs stable generated pandas DataFrame corr ht
  • 致命错误:调用未定义的函数 oci_connect()

    我的下一行未注释 在我的 php ini 中 extension php oracle dll extension php oci8 dll 我下载了这个文件instantclient basiclite nt 11 2 0 2 0 zip
  • FormView ItemTemplate 中的 ASP.net 访问控制

    我有一个表单视图 其中包含一个项目模板 内部有一个控件 是否可以访问该控件 OnDatabound 以便我可以将该控件与数据绑定 我在这里使用面板作为示例
  • 如何设置RecyclerView最大高度

    我想设置 RecyclerView 的最大高度 我可以使用下面的代码设置最大高度 下面的代码使高度为当前屏幕的 60 DisplayMetrics displaymetrics new DisplayMetrics getWindowMan
  • 高级 Javascript:检测当前函数是否被构造函数调用

    在 Javascript 函数中 可以相当简单地检测该函数是否已简单执行或作为对象实例构造函数执行 使用new关键词 constructor function SomeType if this instanceof SomeType cal