JavaScript – 为什么我们必须从一个自调用函数返回一个函数?
此代码有一个运行时错误:
var person = (function(){ var Person = { init: function() { }, }; return new Person(); /*return function(){ new Person(); }*/ })(); console.log(person);
它说我必须返回一个函数,而不是一个普通的对象。
为什么我不能从自调用/匿名外层函数返回对象? 为什么我必须返回一个函数?
同样,这个改变的代码也给了我一个类似的错误:
var person = function(){ var Person = { init: function() { }, }; return new Person(); /*return function(){ new Person(); }*/ }; console.log(person());
为什么我不能从自调用/匿名外层函数返回对象?
你可以返回一个对象,这不是你的代码有什么问题。
你的代码的问题是Person
是一个对象,而不是一个函数。 调用new Person()
是无效的。
var person = (function () { return { name: 'bob' }; }()); console.log(person.name);
这里的问题是你已经将Person
声明为一个对象,并且你不能在一个对象中使用new Person()
。 要在ES5中创build一个“类”,您可以创build一个函数。
var person = (function(){ var Person = function() { this.init = function() { console.log('Initing!') } }; return new Person(); })(); console.log(person);
替代方法是下面的Object构造函数:
var person = function(){ var Person = function(){ this.init = function() { }; }; return new Person(); };
您可以在这里阅读更多关于面向对象的编程。
为什么我必须返回一个函数?
因为new
操作符创build了一个Javascript对象的实例。 而要创build它,它需要一个构造函数 。 这就是你正在问的function。
这几乎就像调用一个典型的函数
function add() { return 1 + 1; } add(); // 2
但是当你用new
操作符调用它的时候,你创build了这个函数对象的一个新实例(函数也是在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; } }; }