Chapter6 对象
原型式继承 prototypal inheritance
除了字符串、数字、true、false、null和undefined之外,JavaScript中的值都是对象。
属性特性:可写,可枚举,可配置
三类JavaScript对象和两类属性
内置对象
宿主对象
自定义对象
自有属性
继承属性
6.1 创建对象
- 对象直接量
- 通过new创建对象
- 原型
- Object.create()
function inherit(p){
if(p==null) throw TypeError();
if(Object.create)
return Object.create(p);
var t=typeof t;
if(t !== "object" && t !== "function") throw TypeError();
function f(){};
f.prototype = p;
return new f();
}
6.2 属性的查询和设置
使用点(.)和方括号([])访问属性。
- 作为关联数组的对象
类属性类似于名值对,和普通hashmap差不多。
- 继承
- 属性访问错误
访问不存在的属性,返回undefined。访问不存在的对象的属性,TypeError。
null 和 undefined不能操作属性。
6.3 删除属性
delete book.author;
delete不能只能删除自有属性,不能删除继承属性。
delete不能删除那些可配置属性为false的属性。
6.4 检测属性
in运算符,hasOwnProperty()和propertyIsEnumerable()
6.5 枚举属性
for/in循环
6.6属性getter和setter
这个还是挺新奇的玩意,类似java的get和set方法,但是不需要在额外申明变量了,或者说不能再声明了。
6.7属性的特性
一个数据属性包含一个名字和四个特性:他的值(value)、可写性(writable)、可枚举性(enumerable)和可配置性(configurable)。
存取器属性不具有值(value)特性和可写性,它们的可写性是由setter方法存在与否决定的。
Object.getOwnPropertyDescriptor()
Object.defineProperty()
6..8对象的三个属性
1.原型属性
Object.getPrototypeOf()
isPrototypeOf()
2.类属性
toString()---->[object class]
3.可扩展性
是否可以给对象添加新属性。
Object.esExtensible(); == Object.isSealed();
Object.preventExtensible() == Object.seal();
Object.freeze(); <--> Object.isFrozen();
6.9序列化对象
将对象的状态转换为字符串,也可还原。
JSON.stringify() <--> JSON.parse();
6.10对象方法
所有的JavaScript对象都从Object.prototype继承属性,这些继承属性主要是方法。
1.toString()方法
2.toLocalString()
3.toJSON()
4.valueOf()