对象字面量和函数之间存在(在我看来是根本的)差异,即“私有”变量。由于一个对象不能被实例化(因为它已经是Object 的一个实例)它不可能拥有自己的(新的)作用域。它是高级 JS 编程的基本概念。拥有一个新的作用域可以让你做几乎所有事情(你可以声明你自己的window、document 或者你想要的任何东西,除了你自己的作用域内的 JS keywords)。现在,一些简单的例子:
假设您要创建同一对象的大量实例(使用尽可能少的行):
function MyObj(i) {
var privateCounter = "I am the instantiated object " + i + " .";
this.counter = function() {
return privateCounter;
};
}
var MyObjList = [],
ObjLitList = [];
for (var i = 0; i < 100; i++) {
MyObjList.push(new MyObj(i));
ObjLitList.push({counter: "I am the literal object number " + i + "."});
}
现在您有 200 个对象,几乎,但不是精确,相同的东西。您可以随意扩展它们,因为函数 是 对象,但对于函数,您不能直接访问 private 变量。让我们看看函数有哪些优点:
- 它被视为
Object
- 它有自己的
Prototype
- 它有私有变量
Objects 呢?
- 它是
Object
- 它没有自己的
Prototype,但您可以声明函数并扩展对象本身
- 它没有私有变量
除了私有变量之外,它们彼此没有太大区别。
让我们看看一个函数的原型能做什么:
MyObj.prototype.setX = function(x) {
this.x = x;
}
使用原型允许您创建一个匿名函数(也可以命名然后分配)的唯一实例,该实例将在实例之间共享。你怎么能用对象字面量做同样的事情呢?
function setX(x) {
this.x = x;
}
var obj = {
setX: setX
};
如您所见,您必须创建定义每次属性为setX 的对象。否则,您可以扩展 Object.prototype 本身(但关于扩展原生 JS 对象的原型存在长期争论)。
那么最佳方法是什么?没有一个,这取决于你必须做什么,你需要从你的脚本中得到什么,这两者中的哪一个你觉得更舒服。
我更喜欢编写自己的函数并将它们视为类,因为它们更具可读性并且我能够使用“私有”变量。我不知道有人使用文字而不是函数。
至于问题:
哪种是最好的编程方式(对象文字 vs 构造函数 vs 原型)
已回答。
是否可以仅使用对象文字而不使用构造函数和原型来编写具有构造函数和原型的代码。
是的,如果你不需要私有变量(如果脚本不是太大的话,你可以。想象一下 jQuery 写成一个对象文字 :D)。
匿名函数的意义是什么。
好吧,我可以举个例子来回答:
//code
myNamedFunction();
//code
function myNamedFunction() {
alert("I'm defined everywhere! :)");
}
这有效,不会生成TypeError。
myAnonymousFunction();
var myAnonymousFunction = function() {
alert("I'm defined after this declaration :(");
}
myAnonymousFunction(); // works!
这将导致Uncaught TypeError: undefined is not a function,因为myAnonymousFunction 只是对有效函数的引用(未命名,因此无法从脚本调用)。
关于这个论点有很多话要说,开始高级编程的好点是Javascript Garden。其他好的阅读是Basics of OOP in JS - NetTutsPlus、Working with Objects - MDN和OOP in JS - Phrogz
希望这会有所帮助!
旁注:函数也有一个很好的优势,因为它们可以仅使用函数(例如call)来更改其上下文(this),而对象则不能。