Object-Oriented JavaScript笔记(三)

Object-Oriented JavaScript 笔记
Object-Oriented JavaScript笔记(一)
Object-Oriented JavaScript笔记(二)
Object-Oriented JavaScript笔记(三)
Object-Oriented JavaScript笔记(四)
Object-Oriented JavaScript笔记(五)
Object-Oriented JavaScript笔记(六)
Object-Oriented JavaScript笔记(七)

第四章 对象

对象
对象属性名需要引号括起来的情况有:
1.保留字2.包含空格或特殊字符3.以数字开头
Best Practice Tip: No quotes
1.使用点访问符访问方法和属性
2.在对象字面量中不要使用引号将属性括起来

构造函数
按照约定,构造函数首字母大写

不使用new操作符调用构造函数跟调用普通函数无异,此时this指针指向全局对象global object

JavaScript 是运行在宿主环境中的,其提供一个全局对象,所有的全局变量都是全局对象的属性。
在浏览器中,该全局对象是window,如
>>> var a = 1;
>>> window.a
1

instanceof操作符用于测试对象的构造函数
注:原书103页的h instanceof Object;得到false实际上是印刷错误, Object是基类

特例:
>>> Object.prototype instanceof Object;
false
>>> Object instanceof Object;
true
说明Object.prototype可能是内置类型
函数返回对象,可以用该特性来改变this指针
function Test = function(){ this.name = ‘Tom’;
return {‘name’:’Tony’};
}

传入函数的对象是按引用传递的,将对象赋值给其他变量也如此,这意味着只是变了别名,修改引用对象也会改变原对象。

指向同一对象的变量比较时才会返回true,即使比较两个对象包含相同的方法和属性得到的也是false。

内置对象

内置对象可以分为三组:
1.数据包装类的 — Object, Array, Function, Boolean, Number, and String
2.工具类的 — Math, Date, RegExp
3.异常类的 — Error

对象构造方法:
1.使用构造函数
var o = new Object();

2.使用字面量
var o = {};

简单对象valueOf方法返回的是自身
>>> var o = {};
>>> o.valueOf() === o
true

继承自Object的对象会带上
o.constructor
o.toString()
o.valueOf()

数组对象

数组对象构造方法:
1.使用构造函数
var a = new Array();

2.使用字面量
var a = [];

数组构造函数传入单个数字的话,定义的是数组的长度;但使用字面量方式不存在该问题。
>>> var a2 = new Array(5);
>>> a2
[undefined, undefined, undefined, undefined, undefined]

>>> var a = [5];
>>> a
[5]

数组的常用方法
1.pop 取出最后一个
2.push 插入元素到尾端
3.sort 对数组元素排序
4.join 将内容转换成字符串
5.slice 切片,不改变原对象
6.splice 切片(或替换),改变原对象

函数
Function构造函数实际上使用了eval来计算传入的字符串,尽量避免使用它。
>>> var second = new Function(‘a, b, c’, ‘d’, ‘return arguments;’);
>>> second(1,2,3,4);
[1, 2, 3, 4]

Function有一个length属性,用来返回函数的参数个数。

Function还有一个caller属性,它不是ECMA标准里面的,但浏览器都实现了它。

实例会可以调用构造函数prototype中属性和方法。

Function的toString方法返回其source code.

call和apply方法可以将对象自己的方法借给其它对象使用。

arguments是个类数组;arguments.callee指向自身。

arguments.callee可以帮助匿名函数调用自身(递归调用):

(function(count){
    if (count < 5) {
        console.log(count);
        arguments.callee(++count);
    }
})(1);

Boolean对象

Boolean对象几乎没有用。在不使用new操作符的情况下,它将非布尔值转换成布尔值,这于使用!!value是等效的。
>>> Boolean(‘test’) == !!’test’
true

Number对象

Number对象比较有趣一点,它有一些有意思的属性:
Number.MAX_VALUE
Number.MIN_VALUE
Number.POSITIVE_INFINITY
Number.NEGATIVE_INFINITY
Number.NaN

Number对象提供三个内置方法:toFixed() 小数点位数
toPrecision() 精度
toExponential() 科学计数法

Number对象的toString方法也是很有趣的,可以传入一个[2~36]之间的整数表示要转换的进制。
>>> (9).toString(2)
“1001”

String对象

原始的string和String对象是不同的
>>> var primitive = ‘Hello’;
>>> typeof primitive;
“string”

>>> var obj = new String(‘world’);
>>> typeof obj;
“object”

因而
>>> Boolean(“”)
false
>>> Boolean(new String(“”))
true

String对象带有一些有用的方法,string类型不带有这些方法和属性,但是在普通类型上调用这些方法的时候,JavaScript将其作为对象对待。

Math/Date

Math/Date/RegExp都是工具对象
Math不是构造函数,不能使用new操作符
Date有两个静态方法
Date.parse(‘Jan 1, 2008’)
Date.UTC(2008, 0, 1)

RegExp

RegExp正则表达式采用的是Perl 5语法
RegExp的几个属性global 全局
ignoreCase 大小写敏感
multiline 多行
lastIndex 开始位置
source 正则表达式

除lastIndex外其余都是只读。

异常
几种内置异常对象,都继承自Error
EvalError
RangeError
ReferenceError
SyntaxError
TypeError
URIError

抛出异常throw new Error(‘Custom Error’);
-EOF-