JavaScript对象类型
C++里面,对象和类型创建的内存结构是一样的,除了虚函数
C++里面实现多态,虚函数对象会多一个4字节的指针,除此之外都一样
JS对象和他们完全不一样
- JS的对象是基于原型的,原型类似JS对象,但是原型和对象是不同的
- JS对象是动态的,可以新增和删除属性,这点和C++不一样
- 为什么可以添加:JS对象本质上不是结构体,本质是一个无序的数据集合
- JS对象本质是哈希表,是key(都是字符串)和value(可以是原始类型或者对象)对照的哈希表
- 对象类型的拷贝是引用拷贝,指向一个相同的内存地址,
- 函数也是一种对象,Object函数对象和Object对象是不同的
对象的生成
- 对象字面量
- 就是若干key\value组成的一个映射表
- 整个对象用花括号包起来
- new构造函数
- 如果不加new只是一个类型转换函数
- 加上new变成一个构造函数,初始化一个新创建的对象
- JS语言核心中的对象类型都包含内置构造函数
- Object.create(原型对象)
- 什么是原型:胚胎
// 字面量
var empty = {}; //没有任何属性
var point = {x:0,y:0}
var point2 = {x:point.x+1,y:point.y+2} //这里x和y都是值类型,不是引用,因为point.x是值
// new构建
var o = new Object();
// create方法
// 以下三行语句等价
var o1 = {};
var o2 = new Object();
var o3 = Object.create(Object.prototype); //prototype就是原型(胚胎)
对象属性
- 点运算符 .
- 方括号运算符
- o[‘p’] 如同C++里面的map操作,表姐体现本质,就是一个映射表
- 读取未声明属性不会报错,返回undefined
- 给未声明的属性赋值,会动态增加新的属性(和map一样)
快速添加属性
var point = {x:5,y:6};
var rsdius = 5;
function area(){
var r = this.radius;
return Math.PI*r*r;
}
var circle = {point,radius,area};
console.log(circle.area())
删除对象
- delete可以删除属性,只是断开属性和对象的联系(内存空间是不会释放的)
- delete运算符不能删除继承属性(要删除继承属性必须从定义这个属性的原型对象删除他,而这会影响到所有集成这个原型的对象)
delete book.author //删除了属性author
delete book['main title'] //删除main title属性
o = [x:1]
in运算
-
用于检查对象是否包含某个属性是否包含某个属性(key)
-
有就是true,否则false
-
不能区分是自有还是继承
-
可以用来遍历属性
for(var i in o){ // 遍历O对象的属性
}
对象属性元信息
六个独立的元信息属性,保存在对象里
- Writeable
- Config
获取对象原信息
var o ={p:'a'}
Object.getOwnProperty(o,'p',{
value;"b",
writable:fales
})
// 获取
defineProperty方法
存取器
存取器accessor提供虚拟属性,即该属性的值不是实际存在的,而是每次计算生成
对象的原型
- 对象采用原型式继承
- 对象的原型:_proto_
- 函数会有一个prototype属性,不是一回事
对象原型链
Object.prototype._proto_
- 字面量的原型:Object.prototype
- 函数的原型:Function
- Object也是一个函数,他的原型也是Function
- 对Object.prototype修改会影响所有的对象
查询时对原型链:当查不到时,就找他的原型对象查,找不到再找原型,直到找到或者null为止
修改属性:如果不存在就创建并赋值;如果其原型链里有改属性,则会在当前对象覆盖
- instanceof
Object函数的方法
-
Object.keys() 返回可枚举的属性集合数组
-
Object.prototype
类似数组的对象
- 有类似下标的key和length属性,但是length不随着元素数量变化而变化。
- 类似数组不是数组,随意对于Array的方法不能对他使用,需要先转化成数组
集合的改进(ES6)
- 对象和数组是常用的集合
- ES6添加了set和map
- 为了实现不同集合的元素遍历,ES6提供便利器对象为各种数据结构进行遍历
For of语法糖
let s = new Set();
[2,3,4,5,6,2,2,].forEach({
})
for(let i of s){
console.log(i)
}
Set.prototype的属性
- .size:实力成员总数
- .add(value):增加一个值
- .delete(value):
- .has(value):判断是否有值
- .clear:清空
- .keys():返回键名的遍历器
- .values():返回键值的遍历器,其实在这里和上面是一样的
- .entries():返回键值对
- forEach():遍历Map的所有成员
Map函数
无参数构造
let m = new Map()
let o = {p:'hello'}
m.set(o.'world')
二位数组为参数
let m = new Map([ ['1','2']]);// 代码可能有误,具体参考ppt
Map.prototype属性
- size
- get(key)
- Keys
- values
- keys
- entries
Iterator遍历器
- 为不同的数据结构提供统一的访问机制
- 遍历要求有symbol.iterator
- map、set可以使用iterator
iterator有两个属性,一个是value一个是done,后者判断是否遍历结束
let arr = ['a','b','c']let iter = arr[Symbol.iterator]();iter.next();
介绍for of循环
- 所以可以使用iterator的集合都可以使用for of
var arr = ['a','b']for(let item of arr.v)