我在 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/