此代码有运行时错误:
var person = (function(){
var Person = {
init: function() {
},
};
return new Person();
/*return function(){
new Person();
}*/
})();
console.log(person);
它说我必须返回一个函数而不是一个普通的Object。
为什么我无法从自我调用/匿名外部函数返回一个对象?为什么我必须返回一个函数?
同样,这个改变的代码也给我一个类似的错误:
var person = function(){
var Person = {
init: function() {
},
};
return new Person();
/*return function(){
new Person();
}*/
};
console.log(person());
答案 0 :(得分:8)
为什么我无法从自我调用/匿名外部函数返回一个对象?
你可以返回一个对象,这不是代码的错误。
您的代码存在的问题是Person
是一个对象,而不是一个函数。致电new Person()
无效。
var person = (function () {
return {
name: 'bob'
};
}());
console.log(person.name);

答案 1 :(得分:1)
这里的问题是您已将Person
声明为对象,并且您无法将new Person()
与对象一起使用。创建一个"类"在ES5中,您可以创建一个函数。
var person = (function(){
var Person = function() {
this.init = function() {
console.log('Initing!')
}
};
return new Person();
})();
console.log(person);
答案 2 :(得分:1)
为什么我必须返回一个函数?
因为new
运算符创建了 Javascript对象的实例。要创建它,它需要一个构造函数。那就是你要问的功能。
它几乎就像调用典型函数一样
function add() {
return 1 + 1;
}
add();
// 2
但是当您使用new
运算符调用它时,您将创建此函数对象的新实例(函数也是Javascript中的对象)。
function myAdder() {
this.a = 1;
this.b = 1;
this.add = function () {
return this.a + this.b;
};
return this;
}
myObject = new myAdder();
myObject.b = 2;
myObject.add();
// 3
myAdder
的对象符号将是:
function myAdder() {
return {
a: 1,
b: 1,
add: function () {
return this.a + this.b;
}
};
}
答案 3 :(得分:1)
替代是以下Object构造函数:
var person = function(){
var Person = function(){
this.init = function() {
};
};
return new Person();
};
您可以阅读有关面向对象编程here的更多信息。