# js对象
- js对象被设计成一组属性的 无序 集合,像是一个哈希表,有key和value组成
- key是一个标识符名称,value可以是任意类型,也可以是其他对象或者函数类型
- 如果值是一个函数,可以称之为是对象的方法
js当中每个对象都有一个特殊的内置属性 [[prototype]],这个特殊的对象可以指向另外一个对象。
这个对象有什么用呢?
- 当通过引用对象的属性key来获取一个value时,它会触发 [[Get]]的操作;
- 这个操作会首先检查该属性是否有对应的属性,如果有的话就使用它;
- 如果对象中没有改属性,那么会访问对象[[prototype]]内置属性指向的对象上的属性;
获取的方式有两种:
- 方式一:通过对象的
__proto__(隐式原型)属性可以获取到(但这个是早期浏览器自己添加的,存在一定兼容问题); - 方式二:通过 Object.getPrototypeOf 方法可以获取到;
- 方式一:通过对象的
# 对象属性名
在对象中,属性名永远都是字符串。如果你使用 string(字面量)以外的其他值作为属性名,那它首先会被转换为一个字符串。即使是数字也不例外,虽然在数组下标中使用的的确是数字,但是在对象属性名中数字会被转换成字符串,所以当心不要搞混对象和数组中数字的用法:
var myObject = { };
myObject[true] = "foo";
myObject[3] = "bar";
myObject[myObject] = "baz";
myObject["true"]; // "foo"
myObject["3"]; // "bar"
myObject["[object Object]"]; // "baz"
# 对象可计算属性名
ES6 增加了可计算属性名,可以在文字形式中使用 [] 包裹一个表达式来当作属性名:
var prefix = "foo";
var myObject = {
[prefix + "bar"]:"hello",
[prefix + "baz"]: "world"
};
myObject["foobar"]; // hello
myObject["foobaz"]; // world
# JavaScript中的对象分类
可以把对象分成几类。
宿主对象(host Objects):由JavaScript宿主环境提供的对象,它们的行为完全由宿主环境决定。(在浏览器环境中,全局对象是window,window上又有很多属性,如document。)
内置对象(Built-in Objects):由JavaScript语言提供的对象。
- 固有对象(Intrinsic Objects ):由标准规定,随着JavaScript运行时创建而自动创建的对象实例。
- 原生对象(Native Objects):可以由用户通过Array、RegExp等内置构造器或者特殊语法创建的对象。
- 普通对象(Ordinary Objects):由{}语法、Object构造器或者class关键字定义类创建的对象,它能够被原型继承。
# 属性的类型
数据属性
- [[Configuerable]]:表示属性是否可以通过delete删除并重新定义
- [[Enumberable]]:是否可以使用for-in返回该属性
- [[Writale]]
- [[Value]]
访问器属性
- [[Configuerable]]
- [[Enumberable]]
- [[Get]]:读
- [[Set]]:写
对象 →