javascript - 有没有办法从 Javascript 中的引用重写构造函数?

标签 javascript closures

假设我有以下代码,我无法修改

var namespace = {};

function() {
    var MyConstructorFunction = function() {
        alert("default behavior");
    };

    namespace.MyConstructorFunction = MyConstructorFunction;

    setTimeout(function() {
        var instance = new MyConstructorFunction();
    }, 1000)
}();

我想在全局范围内从外部添加一些代码,我只能访问命名空间,以便使用alert("构造实例自定义行为");

为了澄清我的意图,假设我可以想到这两种方法:

namespace.MyConstructorFunction = function() {
    alert("custom behavior");
};

namespace.MyConstructorFunction.prototype.constructor = function() {
    alert("custom behavior");
};

但显然它们不起作用。有什么办法可以做到这一点吗?

最佳答案

您可以使用原型(prototype)链来覆盖命名空间中的方法。

// create an object that inherits from namespace
var o = Object.create(namespace);

// Override the MyConstructorFunction property
o.MyConstructorFunction = function ()  {
    alert("custom behavior");
}

并且您可以重用命名空间 token

namespace = o;

或者,如果您愿意,也可以使用不同的命名空间。

Object.create 是一个 ES5 功能,无法在 ES3 中完全模拟,但在这个用例中,它应该与基本的 polyfill 一起使用。 .

<小时/>

但是我知道您想从 setTimeout 调用不同的构造函数,在本例中这是不可能的。该函数引用了无法更改的局部变量。虽然您可以像本示例中那样更改对象的全局行为,但您无法更改闭包内的变量,除非通过可以查看这些变量的函数。如果函数要引用全局范围的变量而不是局部范围的变量,那么你会很幸运。

即:

var namespace = {};

function() {
    var MyConstructorFunction = function() {
        alert("default behavior");
    };

    namespace.MyConstructorFunction = MyConstructorFunction;

    setTimeout(function() {
        var instance = new namespace.MyConstructorFunction(); // reference global
    }, 1000)
}();

关于javascript - 有没有办法从 Javascript 中的引用重写构造函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13032286/

相关文章:

javascript - 下面的代码中闭包做了什么?

javascript - 重访 Python 私有(private)实例数据

javascript - Google Closure Compiler 会降低性能吗?

javascript - $InstallationId 标记的通知中心推送问题

javascript - 指令未在 <Enter> 按键上触发

javascript - ES2015 (ES6) 类中类构造函数的闭包

javascript - 为什么使用命名空间并用 "this"污染代码

JavaScript 在页面重新加载时维护计数值

javascript - php表单在循环中构建,javascript仅影响第一个元素

javascript - js 中的闭包如何与 let 一起工作?