对象文字与构造函数+原型
Object literal vs constructor+prototype
对象文字=用大括号包裹的名称-值对。
Constructor=用于使用关键字new创建多个实例的函数。
原型=用于文本的扩展。
这就是我到目前为止所理解的。但我研究得越多,就越困惑于它们中每一个的意义是什么。我在代码中多次使用构造函数、原型和文字。但每次我使用它们时,我都觉得自己还没有意识到它的全部潜力。我希望stackoverflow的人能帮助我实现
-
哪个是最佳首选编程方式(对象文字与构造函数与原型)
-
一个带有构造函数和原型的代码可以只使用对象文字来编写吗而不使用使用构造函数和原型。
-
匿名函数的意义是什么。
一个非常简单的例子也可以证明它们的重要性。我知道它们是什么,但我不知道它们可以发挥什么样的魔力。
对象文字和函数之间有一个(在我看来是根本的)区别;私人的";变量。由于对象无法实例化(因为它已经是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
呢?
- 它是
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文字: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-NetTutsPlus中OOP的基础知识,使用对象-MDN和JS-Phrogz 中的OOP
希望这能有所帮助!
旁注:函数也有一个很好的优势,因为它们可以通过函数(例如call
)更改上下文(this
),而对象则不能。
- 如何从构造函数中调用js原型方法
- 通过原型/构造函数从复选框输出值
- Javascript:继承原型而不重新定义构造函数
- 使用sinon.js创建一个“;“间谍对象”;使用基于真实构造函数/原型的间谍方法
- 使用构造函数 - 原型从文本框输出值
- JavaScript原型构造函数只调用过一次
- JavaScript 原型构造函数语法 1 与语法 2
- 构造函数属性值应该是什么 .a 原型构造函数或对象构造函数本身
- 什么是原型?构造函数或其他对象
- 在对象上正确设置原型构造函数
- 重构JavaScript原型构造函数中的重复代码
- 是否需要在经典继承中更改子类的“原型.构造函数”
- 将实例属性放置在原型构造函数中,无论好坏
- javascript原型构造函数和instanceof
- 正在原型构造函数中创建对象引用
- 在javascript的构造函数本身中获取原型构造函数的名称
- 原型构造函数和私有属性的区别
- 为什么原型构造函数中的变量在作为属性访问时未定义
- 如何在 Typescript 中实现无原型构造函数
- 如何为原型链中的构造函数找到根原型构造函数?