JavaScript 的对象
对象的定义
指一种复合
的数据类型,对象可以保存多种不同的数据类型的属性
。
除了5种基本
数据类型(Number、String、Boolean、unll、undefined)外,其他的都属于对象。
对象属于引用
数据类型。
对象的3个分类
- 内置对象:由ES标准定义的对象,可以在实现中直接使用。如:Math、String、Function、Object等对象。
- 宿主对象:由 JS 运行环境提供的对象,主要是浏览器提供的对象。如:BOM(浏览器对象模型)、DOM(文档对象模型)。
- 自定义对象:由开发者创建的对象。
创建对象的4个方式
- 使用Object的
构造函数
创建
构造函数必须使用new 函数名()
的语法格式。
var obj = new Object(); //当没有参数时,括号可以省略
这是使用了 Object 默认的构造函数,创建完成对象后,还要为对象添加属性,比较麻烦,而且创建出来的对象都是 Object 类型。
可以通过自定义构造函数的方法,创建不同的类。对象是类的实例,类是对象的抽象。
function Person(name,age){
this.name = name;
this.age = age;
this.sayName = function(){
console.log(this.name);
}
}
var per = new Person("zhangSan",18);
per.sayName();
console.log(per);
直接通过构造函数,即可批量创建对象了。
- 使用
直接量
创建对象
语法:var 对象名 = {属性名:属性值,属性名:属性值,...}
var obj = {
name:"lin",
age:18
}
- 使用
Object.create()
函数创建对象
var obj = Object.create({
name:"lin",
age:18
})
- 自定义
工厂模式
创建对象
工厂模式可以批量创建对象,但是创建的所有的对象都是同一个类型,不好区分对象。
function createObject(name,age){ //自定义一个函数
var obj = new Object(); //声明一个对象
obj.name = name; //利用形参初始化
obj.age = age;
obj.sayName = function(){
console.log(obj.name);
}
return obj; //返回这个对象
}
var obj1 = createObject("lin",18); //接收对象
var obj2 = createObject("zhangSan",23);
obj1.sayName(); //执行对象的方法
obj2.sayName();
添加或修改对象的属性
语法1:对象名.属性名=属性值
语法2:对象名[属性名]=属性值
(推荐使用这种方式)
- 属性名默认是字符串类型,不要求遵守标识符的规范(推荐按照规范命名)。如果要使用不遵守标识符的规范的属性名时,第1种语法会报错,只可以使用第2种语法。
- 属性值可以是任意的数据类型,包括对象类型。
obj.name="lin";
obj[123]=18;
当对象中还没存在这个属性时,该语法是添加这个属性。如果已经存在这个属性了,是修改属性值,因为后面的值会把前面的值覆盖
了。
获取对象属性
语法1:对象名.属性名
语法2:对象名[属性名]
注意:语法2属性名一定加上引号,因为属性名是字符串类型。
console.log(obj.name);
如果对象不存在这个属性,浏览器不会报错,会获取一个 undefined 的属性值。
删除对象
语法1:delete 对象名.属性名
语法2:delete 对象名[属性名]
delete obj.name;
delete obj[123];
当删除这个属性后,再获取属性值,只能获取一个 undefined 的属性值。
delete 只可以删除对象的属性,不可以删除对象。
拓展:构造函数的执行流程
- 创建一个新的对象
- 将新建的对象设置为函数中的 this,可以使用 this 来引用函数。
- 执行函数中的代码
- 将新对象作为返回值返回
拓展:类 与 对象
使用同一个构造函数创建的对象,称为一类对象,也将一个构造函数称为一个类。
通过构造函数创建的对象,成为该类的实例。
对象是类的实例,类是对象的抽象。
拓展:in 运算符
定义:该运算符可以检测一个对象中是否含有指定的属性。
语法:“属性名” in 对象名
var obj = {
name:"lin",
age:18
}
console.log("age" in obj); // true
拓展:instanceof 运算符
定义:判断一个对象是否是某个类的实例。
语法:对象 instanceof 构造函数
var per = new Person("zhangSan",18);
console.log(per instanceof Person);
所有对象 都是 Object 的实例。