对象文字与构造函数+原型

HIR*_*KUR 37 javascript constructor prototype object-literal

Object literal =用花括号包裹的名称值对.

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

原型 =用于扩展文字.

这是我到目前为止所理解的.但是我研究得越多,我就越不清楚每一个人的意义是什么.我曾经在我的代码中使用了构造函数,原型和文字几次.但每次我使用它们时,我觉得我仍然没有意识到它的全部潜力.我现在想要成为一个初学者领先一步.我想希望stackoverflow的人帮助我实现它

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

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

  3. 什么是匿名函数的重要性.

一个非常简单的例子也证明了它们的重要性.我知道它们是什么,但我不知道它们可以做些什么.

Nic*_*ngo 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 + "."});
}
Run Code Online (Sandbox Code Playgroud)

现在你有200个对象几乎,但不完全是同一个东西.您可以根据需要扩展它们,因为函数对象,但在函数的情况下,您无法private直接访问变量.让我们看一下函数的优点:

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

那个Object

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

除了私人诉讼之外,他们彼此并没有太大的不同.

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

MyObj.prototype.setX = function(x) {
    this.x = x;
}
Run Code Online (Sandbox Code Playgroud)

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

function setX(x) {
    this.x = x;
}
var obj = {
    setX: setX
};
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,您必须创建每次定义属性的对象setX.否则,你可以扩展Object.prototype自己(但是关于扩展原生JS对象的原型存在很长的争论).

那么哪种方式最好?没有人,这取决于你必须做什么,你的脚本需要什么,你感觉更舒服的两个.

我更喜欢编写自己的函数并将它们视为类,因为它们更具可读性,并且我能够使用"私有"变量.我不知道有人使用文字而不是函数.

至于问题:

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

回答.

可以使用构造函数和原型来编写代码,只使用对象文字而不使用构造函数和原型.

是的,你可以,如果你不需要私有变量(如果脚本不是太大.想象一下jQuery写成一个Object文字:D).

什么是匿名函数的重要性.

哦,我可以回答一个例子:

//code
myNamedFunction();
//code
function myNamedFunction() {
    alert("I'm defined everywhere! :)");
}
Run Code Online (Sandbox Code Playgroud)

这有效,不会生成TypeError.

myAnonymousFunction();
var myAnonymousFunction = function() {
    alert("I'm defined after this declaration :(");
}
myAnonymousFunction(); // works!
Run Code Online (Sandbox Code Playgroud)

这将导致a Uncaught TypeError: undefined is not a function,因为myAnonymousFunction它只是对有效函数的引用(它是未命名的,因此它不能从脚本中调用).

关于这个论点有很多话要说,开始高级编程的好处是Javascript Garden.其他好的读物是JS中的OOP基础 - NetTutsPlus,使用对象 - JS中的MDNOOP - Phrogz

希望这可以帮助!

旁注:函数也有很好的优势,因为它们可以this仅使用函数(call例如)更改其context(),而对象则不能.