我一直在使用下面的内容,我已经看过使用function(){}的其他代码,然后使用this关键字,这里有什么区别,我实际上是否在下面实例化了一个对象?
var MyObj = {
propertyOne: 'a',
Method: (function() {
function MyFuncOne() {}
function MyFuncTwo() {}
return {
MyFuncOne: MyFuncOne,
MyFuncTwo: MyFuncTwo
}
})()
}
答案 0 :(得分:2)
我能想到做这样的事情的唯一原因是你想要在两个函数之间共享一些私有变量(在更改它之后使其成为合法的javascript):
var MyObj = (function() {
var x,y,z; // these will be accessible only to
// the MyFuncOne and MyFuncTwo functions
function MyFuncOneA() {}
function MyFuncTwoA() {}
return {
MyFuncOne: MyFuncOneA,
MyFuncTwo: MyFuncTwoA
}
})();
我必须改变你的语法,甚至让它工作,因为你有myObj = {{...}},这不是很有用,可能甚至没有效果。
除了这个私有但共享的变量概念之外,它只是用于在对象上声明两个方法的额外(并且令人困惑)语法,这些方法有更清晰的方法。
如果您没有使用私有变量,那么上面的示例在功能上与这个更简单的语法相同,这对我来说更有意义:
var MyObj = {
MyFuncOne: function() {},
MyFuncTwo: function() {}
};
答案 1 :(得分:2)
是的,你已经实例化了一个"单身人士"对象有两种方法。
我相信外部花括号是不必要的,你可以写:
var MyObj =
(function() {
function MyFuncOne() {}
function MyFuncTwo() {}
return {
MyFuncOne: MyFuncOne,
MyFuncTwo: MyFuncTwo
};
})();
另一种方法是:
var MyObj =
(function() {
var obj = {};
obj.MyFuncOne = function() {};
obj.MyFuncTwo = function() {};
return obj;
})();
在(function() { /* code here */ })()
中包装JS是防止变量泄漏到全局范围的好方法。在这种情况下,您可以使用它来组装对象。
答案 2 :(得分:1)
使用带有this
关键字的函数,您可以使用对象文字(这是您上面的匿名函数返回的内容)做一些事情(或者至少很容易)。最常见的是,创建“类型”。
function Animal () { }
Animal.prototype.speak = function () {
return "";
};
var dog = new Animal();
dog instanceof Animal; // returns true
这也使继承更容易:
function Feline () { }
Feline.prototype = new Animal;
Feline.prototype.speak = function () {
return "meow";
};
function Lion () { }
Lion.prototype = new Feline;
Lion.prototype.speak = function () {
return "roar";
};
function Cat () { }
Cat.prototype = new Feline;
var leo = new Lion();
var baxter = new Cat();
leo.speak(); // returns "roar"
baxter.speak(); // returns "meow" - from prototype chain
leo instanceof Feline; // returns true
leo instanceof Animal; // returns true
leo instanceof Cat; // returns false