对象字面值vs构造函数+原型
对象字面值 =用花括号包裹的名称值对。
构造函数 =用于使用关键字new创build多个实例的函数。
原型 =扩展一个文字。
这是我迄今为止所了解的内容。但是我研究得越多,我就越感到困惑,他们每个人的意义何在。 我在代码中使用了构造函数,原型和文字几次,但是每次使用它们,我都觉得我还没有意识到它的全部潜力。我现在想要成为一名开发人员,只能领先一步。希望在stackoverflow的人帮助我实现它
-
哪个是最好的编程方式( 对象文字与构造函数vs原型 )
-
可以使用构造函数和原型的代码,只使用对象文字而不使用构造函数和原型。
-
匿名函数的意义是什么?
一个非常简单的例子表明他们的重要性也将做。我知道他们是什么,但我不知道他们可以做什么可能的魔法。
在我看来,(基本的)对象文字和function,“私人”variables是有区别的。 由于一个对象不能实例化(因为它已经是Object
一个实例),所以它不可能拥有自己的(新) 范围 。 这是高级JS编程的基本概念。 拥有一个新的范围允许你做几乎所有的事情(你可以声明你自己的window
, document
或任何你想要的,除了在你自己的范围内的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个几乎是但不完全一样的东西。 您可以根据需要扩展它们,因为函数是对象,但在函数的情况下,您不能直接访问private
variables。 让我们看看哪个是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
),而对象不能。