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

pot*_*nch 1 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"
Run Code Online (Sandbox Code Playgroud)

这按预期工作,没有错误.我想做的是在创建对象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");
    }
}());
Run Code Online (Sandbox Code Playgroud)

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

Way*_*ett 5

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

换句话说,你不能改变它 MyModule的构造函数.这是一个毫无意义的陈述.

现在,当你写:

var MyModule = {};
Run Code Online (Sandbox Code Playgroud)

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

console.log(MyModule.constructor) // prints Object()
Run Code Online (Sandbox Code Playgroud)

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

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

就是那样子.

现在,您可以保存对包含所有先前设置的属性的对象的引用,并MyObject在将该名称指向函数后将其复制回.但我不确定这是什么意思.