对象文字 =用大括号包裹的名称值对。
构造函数 =用于使用关键字new创建多个实例的函数。
原型 =用于扩展文字。
这是我到目前为止所理解的。但是我研究的越多,我就会对每一个的重要性感到困惑。 我已经在我的代码中使用了构造函数,原型和文字几次。但每次我使用它们时,我觉得我仍然不知道它的全部潜力。我现在想成为一名初学者领先一步。我希望stackoverflow的人帮助我实现它
最佳首选编程方式(对象 文字与构造函数与原型)
可以使用对象文字来编写具有构造函数和原型的代码 没有使用构造函数和原型。
匿名函数的重要性是什么。
一个非常简单的例子也证明了它们的重要性。我知道它们是什么,但我不知道它们可以做什么可能的魔法。
答案 0 :(得分:28)
在对象文字和函数之间存在(基本的,在我看来)差异,即“私有”变量。由于无法实例化对象(因为它已经是Object
的实例),因此它不可能拥有自己的(新)范围。它是高级JS编程的基本概念。拥有一个新的范围可以让您几乎完成所有事情(您可以声明自己的window
,document
或您想要的任何内容,除了您自己范围内的JS 关键字。现在,举一些简单的例子:
假设您要创建同一对象的大量实例(使用尽可能少的行):
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
Object
s?
Object
Prototype
,但您可以声明函数并扩展对象本身除私人诉讼外,他们彼此并无太大差异。
让我们看看函数的原型可以做什么:
MyObj.prototype.setX = function(x) {
this.x = x;
}
使用原型允许您创建匿名函数的唯一实例(也可以命名然后分配),这将在实例之间共享。你如何用对象文字做同样的事情?
function setX(x) {
this.x = x;
}
var obj = {
setX: setX
};
正如您所看到的,您必须创建每次定义setX
属性时定义的对象。否则,您可以扩展Object.prototype
本身(但是关于扩展原生JS对象原型的争论很长。)
哪种最佳方式?没有人,这取决于你必须做什么,你的脚本需要什么,你感觉更舒服的两个。
我更喜欢编写自己的函数并将它们视为类,因为它们更具可读性,并且我能够使用“私有”变量。我不知道有人使用文字而不是函数。
至于问题:
哪种是最佳的编程方式(对象文字与构造函数对原型)
回答。
可以使用构造函数和原型来编写代码,只使用对象文字,而不使用构造函数和原型。
是的,如果你不需要私有变量(如果脚本不是太大,你可以这样做。想象一下jQuery被写为Object literal: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
只是有效函数的引用(未命名,因此无法从脚本调用)。< / p>
关于这个论点有很多话要说,开始高级编程的一个好点是Javascript Garden。其他好的读数是Basics of OOP in JS - NetTutsPlus,Working with Objects - MDN和OOP in JS - Phrogz
希望这有帮助!
旁注:函数也有很好的优势,因为它们可以仅使用函数(例如this
)更改其上下文(call
),而对象则不能。