对象字面值vs构造函数+原型

对象字面值 =用花括号包裹的名称值对。

构造函数 =用于使用关键字new创build多个实例的函数。

原型 =扩展一个文字。

这是我迄今为止所了解的内容。但是我研究得越多,我就越感到困惑,他们每个人的意义何在。 我在代码中使用了构造函数,原型和文字几次,但是每次使用它们,我都觉得我还没有意识到它的全部潜力。我现在想要成为一名开发人员,只能领先一步。希望在stackoverflow的人帮助我实现它

  1. 哪个是最好的编程方式( 对象文字与构造函数vs原型

  2. 可以使用构造函数和原型的代码,只使用对象文字而不使用构造函数和原型。

  3. 匿名函数的意义是什么?

一个非常简单的例子表明他们的重要性也将做。我知道他们是什么,但我不知道他们可以做什么可能的魔法。

在我看来,(基本的)对象文字和function,“私人”variables是有区别的。 由于一个对象不能实例化(因为它已经是Object一个实例),所以它不可能拥有自己的(新) 范围 。 这是高级JS编程的基本概念。 拥有一个新的范围允许你做几乎所有的事情(你可以声明你自己的windowdocument或任何你想要的,除了在你自己的范围内的JS 关键字 )。 现在举一些简单的例子:

假设您想要创build大量同一对象的实例(使用尽可能less的行):

 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个几乎是但不完全一样的东西。 您可以根据需要扩展它们,因为函数对象,但在函数的情况下,您不能直接访问privatevariables。 让我们看看哪个是function的优点:

  • 它被视为一个Object
  • 它有自己的Prototype
  • 它有私有variables

Object

  • 一个Object
  • 它没有自己的Prototype ,但可以声明函数并扩展对象本身
  • 它没有私有variables

除了私人汽车之外,他们没有太大的区别。

让我们看看一个函数的原型可以做什么:

 MyObj.prototype.setX = function(x) { this.x = x; } 

使用原型允许您创build一个匿名函数 (可以被命名,然后分配)的唯一实例,它将在实例之间共享。 你怎么能用对象文字做同样的事情?

 function setX(x) { this.x = x; } var obj = { setX: setX }; 

正如你所看到的,你必须创build一个定义每个属性setX的对象。 否则,你可以扩展Object.prototype本身(但是关于扩展原生JS对象的原型还有很长时间的争论)。

那么哪个是最好的方法? 没有人,这取决于你必须做什么,你需要从脚本中得到什么,你觉得哪一个更舒服。

我更喜欢编写自己的函数,并把它们当作类来对待,因为它们更具可读性,我可以使用“私有”variables。 我不知道任何人使用文字而不是function。

至于问题:

哪个是最好的编程方式(对象文字与构造函数vs原型)

回答。

可以使用构造函数和原型的代码,只使用对象文字而不使用构造函数和原型。

是的,你可以,如果你不需要私有variables(如果脚本不是太大,想象一下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只是对有效函数的引用 (它是未命名的,所以它不能从脚本中调用)。

关于这个说法有很多事情要说,开始高级编程的一个好处就是Javascript Garden 。 其他好的读物是JS的OOP的基础 – NetTutsPlus , 使用对象 – JS中的 MDN和OOP – Phrogz

希望这可以帮助!

旁注:函数也有一个很好的优势,因为他们可以改变他们的上下文( this )只是一个函数(例如call ),而对象不能。