javascript - 如何在将对象的构造函数更改为实例函数时保留 Javascript 对象的属性

标签 javascript

我在 javascript 中有一个实例函数,为了命名约定,我将其他实例函数添加为第一个实例函数对象的属性。下面的工作 JavaScript 更好地说明了这一点。

var MyModule = (function() { // instance function 
    return function() {
      console.log("ran MyModule");
    }
}());

MyModule.RelatedModule = (function() { //second instance function is a property of first instance function object
    return function() {
        console.log("ran RelatedModule");
    }
}())

var inst1 = new MyModule(), // logs "ran MyModule"
    inst2 = new MyModule.RelatedModule(); // logs "ran RelatedModule"

这按预期工作,没有错误。不过,我想做的是在创建 MyModule 对象后为 MyModule 创建函数定义,谁能帮我实现这个目标?我在下面说明了我的尝试。

var MyModule = {}; // create object first, try to set a constructor on it later

MyModule.RelatedModule = (function() { // add properties to the MyModule object
    return function() {
        console.log("ran RelatedModule");
    }
}())

// the following does not work, I'd like to set the `MyModule` constructor instance function and retain the `MyModule.RelatedModule` property
MyModule.constructor = (function() {
    return function() {
      console.log("ran MyModule");
    }
}());

那么,如何保留对象的属性并更改其构造函数?

最佳答案

您混淆了几个概念。在您的第一个示例中,MyModule 没有 构造函数,它 构造函数。也就是说,它是一个函数对象,您打算将其与 new 运算符一起使用来创建新对象。这些对象将有一个 constructor 属性,它指向 MyModule(创建它们的函数)。更改此 constructor 属性不会对 MyModule 产生任何影响;该属性只是指向实例化对象的函数的指针。

换句话说,您不能更改 MyModule 的构造函数。这是一个毫无意义的声明。

现在,当你写:

var MyModule = {};

...您创建了一个新对象,其 constructor 属性为 Object():

console.log(MyModule.constructor) // prints Object()

同样,更改此属性并没有太大作用(除了混淆一些有用的簿记)。

此时 MyModule 只是一个普通的旧对象。这根本不是一个功能。这就是您收到“不是函数”错误的原因。因为它不是,但你正试图像它一样使用它。如果您希望该名称引用一个函数(即另一个对象),那么您将丢失对您之前设置的任何属性的所有引用,因为您指向的是一个全新的对象 .

就是这样。

现在,您可以保存对包含所有这些先前设置的属性的对象的引用,并在将该名称指向功能。但我不确定重点是什么。

关于javascript - 如何在将对象的构造函数更改为实例函数时保留 Javascript 对象的属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8660823/

相关文章:

javascript - map 未返回正确的数据类型

javascript - 迭代对象数组并用数组中的值替换值

javascript - AJAX 表单不显示成功或错误消息

javascript - Chartjs 时间图 xAxis 显示 1970 年

javascript - React-router 在transitionTo 上意外重新加载(Chrome)

javascript - jQuery 插件的每个实例如何拥有自己的属性和方法?

javascript - 边缘的 CSS 动画转换错误

javascript - 跨域AJAX请求

Google 主页上的 JavaScript?

javascript - 什么时候在 JS 中使用 .bind()