第十二章:第13节JavaScript对象——自定义一个对象

更新于:2017-11-30 20:05:01

在PHP中怎么实现一个对象:先写一个类,类里有属性,有方法。使用对象时实例化这个类。


JS是纯面向对象编程语言,就连数组和函数都是以对象的方式实现的。


想象下:JS的数组、函数,我们可理解为JS内置了可实现数组功能、函数功能的Array类、Function类,定义了一个数组、函数等于实例化了Array类、Function类,数组元素、函数代码可看做类中构造方法的参数。


JS的对象和PHP的对象类似的地方,它也是由属性和方法构成的。属性是可以赋值的,方法就是函数,要跟一个小括号。


比如:人是一个“对象”,人的特征有:姓名、性别、身高、体重等。人的行为:人骑自行车、开车、跑步等。如:

var len = arr.length;   //属性,赋值或取值

var scorce = window.prompt(“请输入一个分数”);   //方法就是函数,函数有参数,方法也有参数


自定义对象:


PHP里边,是从一个类里边获得一个具体对象。Javascript里边,是没有类的概念的(我们可以理解对象需要一个类,只是JS不支持用户自定义类,不能像PHP那样先写一个类再实例化)。我们可通过下面三种方式自定义对象:


第一种方法:使用new关键字实例化Object对象创建


先看示例:


1.png

1.png

详解:


1)在PHP中,是不是有一个内置类“stdClass”,无需定义可直接实例化,实例化后的对象可以添加属性。JS的“Object”就相当于PHP的“stdClass”类。


下面摘自W3CSchool手册上对Object 对象的介绍:


Object 对象自身用处不大,不过在了解其他类之前,还是应该了解它。因为 ECMAScript 中的 Object 对象与 Java 中的 java.lang.object 相似,ECMAScript 中的所有对象都由这个对象继承而来,Object 对象中的所有属性和方法都会出现在其他对象中,所以理解了 Object 对象,就可以更好地理解其他对象。


通过上面的介绍,我们可知道任何对象(包括数组、函数)都继承父类对象“Object”。


2)可直接为对象添加公开的属性,函数也是对象,所以也可以作为对象的属性值。


3)this通过PHP的知识可猜出指的是当前对象,可JS中一切都是对象,具体这个this指的哪一个对象:this在函数/方法里边,代表调用该函数/方法的当前对象。”上面示例中,this是obj对象,而不是函数对象。


第二种方法:使用大括号{ }来创建


看示例代码:


1.png

1.png

详解:


简单的JS对象创建第二种方法用的多。它的书写格式:{'属性名':'属性值',……}。多个属性之间用“,”隔开。属性值可以是基本数据类型,可以是数组、函数等对象。


拓展:


不知大家有没有注意到这种定义对象的格式和json数据格式十分相似。下面是一个JSON格式的字符串:


{"firstName": "Brett", "lastName": "McLaughlin"}


JSON全名“JavaScript Object Notation”——JS对象标记,没错,JSON指的就是一个JS对象字符串。


JSON 是 JS 对象的字符串表示法,它使用文本表示一个 JS 对象的信息,本质是一个字符串。


json怎么转成JS对象?


PHP中有一个函数eval,可以把字符串作为PHP代码执行。同样,JS也有eval函数。


附:JS的几个全局函数。

1.png


eval使用注意:


800.jpg

看上图中变量code3,它虽然是一个json格式的字符串,如果用eval把它转成JS对象,必须要给它加括号。


eval('('+返回的json格式字符串+')')


Eval把json格式字符串转换为json对象为什么要加括号?


加上圆括号的目的是迫使eval函数在评估JavaScript代码的时候强制将括号内的表达式(expression)转化为对象,而不是作为语句(statement)来执行。举一个例子,例如对象字面量{},如若不加外层的括号,那么eval会将大括号识别为JavaScript代码块的开始和结束标记,那么{}将会被认为是执行了一句空语句。


1 alert(eval("{}");  // return undefined
2 alert(eval("({})");// return object[Object]


第三种方法:使用构造函数创建 


1.png

1.png


详解:


我们学习了PHP的对象创建,这种方法其实很好理解。虽然JS不能自定义类,它可以定义构造函数。上面示例中Person函数就是一个构造函数。


构造函数和普通函数的区别:

没有区别,就看使用,new就是构造函数,函数()就是普通函数调用。


注意:虽然Person也是一个对象,构造函数里的this指的是obj(29行代码实例化构造函数后的对象),不是Person。


本节学习代码》》》