# js对象

  • js对象被设计成一组属性的 无序 集合,像是一个哈希表,有key和value组成
  • key是一个标识符名称,value可以是任意类型,也可以是其他对象或者函数类型
  • 如果值是一个函数,可以称之为是对象的方法

js当中每个对象都有一个特殊的内置属性 [[prototype]],这个特殊的对象可以指向另外一个对象。

  1. 这个对象有什么用呢?

    • 当通过引用对象的属性key来获取一个value时,它会触发 [[Get]]的操作;
    • 这个操作会首先检查该属性是否有对应的属性,如果有的话就使用它;
    • 如果对象中没有改属性,那么会访问对象[[prototype]]内置属性指向的对象上的属性;
  2. 获取的方式有两种:

    • 方式一:通过对象的 __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关键字定义类创建的对象,它能够被原型继承。

# 属性的类型

  1. 数据属性

    • [[Configuerable]]:表示属性是否可以通过delete删除并重新定义
    • [[Enumberable]]:是否可以使用for-in返回该属性
    • [[Writale]]
    • [[Value]]
  2. 访问器属性

    • [[Configuerable]]
    • [[Enumberable]]
    • [[Get]]:读
    • [[Set]]:写
最后更新: 11/10/2024, 7:57:43 PM