JavaScript面向对象的程序设计

1.内置对象及内置函数 1.1 基本包装类型

(1)在ES中,数据的分类分为基本数据类型和引用类型。 (2)而基本包装类型,严格来说不属于上面两个中的任意一个,但是又和这两种类型息息相关。 (3)基本数据类型和引用类型这两个类型其中一个很明显的区别是,引用类型有自己内置的方法,也可以自定义其他方法用来操作数据。而基本数据类型不能像引用类型那用有自己的内置方法对数据进行更多的操作。 (4)ECMAScript提供了3个特殊引用类型(基本包装类型):Boolean,Number,String。 (5)基本包装类型,和其他引用类型一样,拥有内置的方法可以对数据进行额外操作。 (6)每当读取一个基本类型值的时候,后台就会创建一个对应的基本包装类型对象,从而可以调用一些方法操作这些数据。 例如: var str = 'test'; var str2 = str.substring(2); console.log(str2); 上面str变量存储的值是一字符串,'test'字符串是基本数据类型String类型的值,然后它调用了substring方法,并将结果保存在了str2中。 为什么它不是对象却能调用对象的方法呢? 在执行第二行代码时,JS会自动进行下面的步骤: 1.自动创建String类型的一个实例(和基本类型的值不同,这个实例就是一个基本包装类型的对象) 2.调用实例(对象)上指定的方法 3.销毁这个实例 //用String构造函数创建一个实例,这个实例时一个对象 var str = new String('test'); //对象中有内置方法供开发人员使用 var str2 = str.substring(); //销毁这个实例 str = null; 经过上面的加工后,基本字符串变的跟对象一样,上面这三个步骤也适用于Boolean、Number类型。

1.1.1 JS什么时候会自动创建一个对应的基本包装类型对象呢?
取决于当前执行的代码是否是为了获取他的值 每当读取一个基本类型的值,也就是当我们需要从内存中获取到它的值时(这个访问过程称为读取模式) 这时,后台就会自动创建一个基本包装类型的对象。 var str = 'hhh'; console.log(str); //读取模式,后台自动创建基本包装类型对象 var str2 = str; //赋值给变量str2,也需要读取str的值,同上

1.1.2 引用类型和基本包装类型有什么不同呢?最主要的区别就是对象的生存期。
(1)引用类型:使用new操作符创建的引用类型实例,在执行流离开当前作用域之前一直都保存在内存中。 (2)基本包装类型:只存在一行代码的执行瞬间,然后立即销毁。 var str = 'test'; str.test = 'hhh'; console.log(str.test); //undefined 上面第二行代码给自动创建的String实例对象添加了test属性,虽然此刻代码执行时他是生效的,但是在这行代码执行完毕后该String实例就会立刻被销毁,String实例的test属性也就不存在了 当执行第三行代码时,由于是读取模式,又重新创建了新的String实例,而这个新创建的String实例没有test属性,结果也就是undefined.

1.1.3 怎么才能给基本类型添加方法或者属性呢?
(1)增加对应的包装对象的原型方法 //给字符串添加属性或方法 要写到对应的包装对象的原型下才行 var str = 'hello'; String.prototype.last = function(){ //返回指定位置的字符 return this.charAt(this.length - 1); } console.log(str.last()); //执行到这一句,JS会偷偷做一些事情,相当于 //1.找到基本包装对象,new一个和字符串值相同的对象 var str = new String('hello'); //2.通过这个对象找到了包装对象下的方法并调用 str.last(); //3.这个对象被销毁 str = null; (2)使用new运算符创建String对象 //new 运算符 var str = new String('hello'); //有效属性 str.name = 'HI'; //有效方法 str.age = function(){ return 100; } 注意:在使用new运算符创建String,Number,Boolean三种类型的对象时,可以给自己添加属性或者方法;或增加对应的包装对象的原型方法;但我们建议不要这样使用,因为这样会导致根本分不清到底是基本类型还是引用类型。

1.1.4 Boolean类型
Boolean类型没有特定的属性或者方法。一般直接将Boolean当作一个工具方法来使用

1.1.5 Number类型
(1)内置属性(静态属性,直接调用即可)

属性 描述
MAX_VALUE 可表示的最大的数。
MIN_VALUE 可表示的最小的数。
NaN 非数字值。
NEGATIVE_INFINITY 负无穷大,溢出时返回该值。
POSITIVE_INFINITY 正无穷大,溢出时返回该值。
prototype 使您有能力向对象添加属性和方法。
(2)内置方法(对象方法)

方法 描述
toString 把数字转换为字符串,使用指定的基数。
toLocaleString 把数字转换为字符串,使用本地数字格式顺序。
toFixed 把数字转换为字符串,结果的小数点后有指定位数的数字。
toExponential 把对象的值转换为指数计数法。
toPrecision 方法可在对象的值超出指定位数时将其转换为指数计数法。
valueOf 返回一个 Number 对象的基本数字值。
1.1.6 String类型
(1)对象属性

属性 描述
constructor 对创建该对象的函数的引用
length 字符串的长度
prototype 允许您向对象添加属性和方法
【JavaScript面向对象的程序设计】String也包含对象的通用方法,比如valueOf()、toLocaleString()和toString()方法,但这些方法都返回字符串的基本值
(2)字符方法 1.charAt(index) 返回指定索引位置的字符串 2.charCodeAt(index) 以Unicode编码返回指定索引位置的字符串 (3)字符串操作方法 1.concat() 连接字符串 2.slice() 可提取字符串的某个部分,并以新的字符串返回被提取得部分 3.substring() 提取字符串中两个指定的索引号之间的字符。 4.substr() 从起始索引号提取字符串中 (4)字符串位置方法 1.indexOf(str,n) 从n开始搜索第一个str,并将搜索的索引值返回 2.lastIndexOf(str,n) 从n开始搜索的最后一个str,并将搜索的索引值返回 (5)大小写转换方法 1.toLowerCase() 把字符串转换为小写 2.toUpperCase() 把字符串转换为大写 3.toLocaleLowerCase() 把字符串转换为小写。本地化 4.toLocaleUpperCase() 把字符串转为大写。本地化 (6)字符串的模式匹配方法 1.match() 找到一个或多正则表达式的匹配 2.replace() 替换与正则表达式匹配的子串 3.search() 检索与正则表达式相匹配的值 4.split() 把字符串分割为字符串数组

1.2 Math 对象
Math对象用于执行数学任务。Math对象并不像Date和String那样是对象的类,因此没有构造函数Math(),像Math.sin()这样的函数只是函数,不是某个对象的方法。无需创建它,通过把Math作为对象使用就可以调用其所有属性和方法。

1.2.1 对象属性
(1)E 返回算术常量e,即自然对数的底数(约等于2.718) (2)LN2 返回2的自然对数(约等于0.693) (3)LN10 返回10的自然对数(约等于2.302) (4)LOG2E 返回以2为底的e的对数 (5)LOG10E 返回以10为底的e的对数(约等于0.434) (6)PI 返回圆周率 (7)SQRT1_2 返回2的平方根的倒数 (8)SQRT2 返回2的平方根

1.2.2 对象方法(下面为常用的方法)
(1)比较方法 Math.min()//求一组数中的最小值 Math.max()//求一组数中的最大值 (2)将小数值舍为整数的几个方法 Math.ceil() 向上舍入 Math.floor() 向下舍入 Math.round() 四舍五入 (3)随机数 Math.random() 返回大于0小于1的一个随机数 [0,1)

    推荐阅读