# 对象初识
# 对象简介
对象的作用是:封装信息**。比如 Student 类里可以封装学生的姓名、年龄、成绩等。
对象具有特征(属性)和行为(方法)。
面向对象的特征:封装、继承、多态。
对象:
只要不是那五种基本数据类型,就全都是对象。
如果使用基本数据类型的数据,我们所创建的变量都是独立,不能成为一个整体。
对象属于一种复合的数据类型,在对象中可以保存多个不同数据类型的属性。
对象是保存到堆内存中的,每创建一个新的对象,就会在堆内存中开辟出一个新的空间。变量保存的是对象的内存地址(对象的引用)。
换而言之,对象的值是保存在堆内存中的,而对象的引用(即变量)是保存在栈内存中的。
如果两个变量保存的是同一个对象引用,当一个通过一个变量修改属性时,另一个也会受到影响。
例如:
var obj = new Object();
obj.name = "张三";
var obj2 = obj;
//修改obj的name属性
obj.name = "王五";
上面的代码中,当我修改 obj 的 name 属性后,会发现,obj2 的 name 属性也会被修改。因为 obj 和 obj2 指向的是堆内存中的同一个地址。
# 对象的分类
1.内置对象:
由 ES 标准中定义的对象,在任何的 ES 的实现中都可以使用
比如:Math、String、Number、Boolean、Function、Object....
2.宿主对象:
由 JS 的运行环境提供的对象,目前来讲主要指由浏览器提供的对象。
比如 BOM DOM。比如
console
、document
。3.自定义对象:
由开发人员自己创建的对象
# 创建对象
方法一:
使用 new 关键字调用的函数,是构造函数 constructor。构造函数是专门用来创建对象的函数。
例如:
var obj = new Object();
另外,使用typeof
检查一个对象时,会返回object
。
方法二:
使用对象字面量来创建一个对象:
var obj = {};
使用对象字面量,可以在创建对象时,直接指定对象中的属性。语法:{属性名:属性值,属性名:属性值....}
例如:
var obj2 = {
name: "张三",
age: 26,
sex: "男",
children: {
name: "小明",
},
//我们还可以在对象中增加一个方法。以后可以通过obj2.sayName()的方式调用这个方法
sayName: function() {
console.log("smyhvae");
},
};
对象字面量的属性名可以加引号也可以不加,建议不加。如果要使用一些特殊的名字,则必须加引号。
属性名和属性值是一组一组的键值对结构,键和值之间使用:
连接,多个值对之间使用,
隔开。如果一个属性之后没有其他的属性了,就不要写,
,因为它是对象的最后一个属性。
# 向对象中添加属性
在对象中保存的值称为属性。
向对象添加属性的语法:
对象.属性名 = 属性值;
举例:
var obj = new Object();
//向obj中添加一个name属性
obj.name = "张三";
//向obj中添加一个sex属性
obj.sex = "男";
//向obj中添加一个age属性
obj.age = 18;
console.log(obj);
打印结果:
{
"name":"孙悟空",
"gender":"男",
"age":18
}
补充 1:对象的属性值可以是任何的数据类型,也可以是个函数:(也称之为方法)
var obj = new Object();
obj.sayName = function() {
console.log("smyhvae");
};
console.log(obj.sayName); //没加括号,获取的是对象
console.log("-----------");
console.log(obj.sayName()); //加了括号,执行函数内容,并执行函数体的内容
打印结果:
补充 2:js 中的属性值,也可以是一个对象。
举例:
//创建对象 obj1
var obj1 = new Object();
obj1.test = undefined;
//创建对象 obj2
var obj2 = new Object();
obj2.name = "smyhvae";
//将整个 obj2 对象,设置为 obj1 的属性
obj1.test = obj2;
console.log(obj1.test.name); //smyhvae
# 获取对象中的属性
方式 1:
语法:
对象.属性名;
如果获取对象中没有的属性,不会报错而是返回undefined
。
举例:
var obj = new Object();
//向obj中添加一个name属性
obj.name = "张三";
//向obj中添加一个sex属性
obj.gender = "男";
//向obj中添加一个age属性
obj.age = 18;
// 获取对象中的属性,并打印出来
console.log(obj.sex); // 打印结果:男
console.log(obj.color); // 打印结果:undefined
# 修改对象的属性值
语法:
对象.属性名 = 新值;
obj.name = "tom";
# 删除对象的属性
语法:
delete obj.name;
# 遍历对象中的属性:for in
语法:
for (var key in user) {
//xx.xx 这种形式 只能取原来具有的属性
//非常重要! xx.abc abc是变量,就必须通过 xx[abc] 形式取值
console.log("属性" + key + "==>" + user[key]);
}
解释:对象中有几个属性,循环体就会执行几次。每次执行时,会将对象中的每个属性的 属性名 赋值给变量。
# 自定义构造函数来创建对象
构造函数就是一个普通的函数,创建方式和普通函数没有区别,不同的是构造函数习惯上首字母大写。
构造函数和普通函数的区别就是调用方式的不同:普通函数是直接调用,而构造函数需要使用 new 关键字来调用。
this 的指向也有所不同:
1.以函数的形式调用时,this 永远都是 window。比如
fun();
相当于window.fun();
2.以方法的形式调用时,this 是调用方法的那个对象
3.以构造函数的形式调用时,this 是 new 出来的那个对象
# new 一个构造函数的执行流程
开辟内存空间,存储新创建的对象
将新建的对象设置为构造函数中的 this,在构造函数中可以使用 this 来引用 新建的对象
执行函数中的代码(包括设置对象属性和方法等)
将新建的对象作为返回值返回
因为 this 指的是 new 一个 Object 之后的对象实例。
// 在js中 所有的对象都是函数 所有的函数也可以称为"对象"
// 此时 这个Human为手动创建的自定义构造函数对象
// 在js中 this的指向在调用前是不确定的.
// 面试: 构造函数对象的this指向new出来的实例对象
function Human() {
this.name = "张三";
this.age = 20;
this.say = function() {
alert(this.name + "的年龄为:" + this.age);
};
}
// zs为通过Human创建的一个实例对象
var zs = new Human();
// 通过zs的实例对象调用的属性 和方法
alert("手动弹出name==>" + zs.name);
zs.say();
// var date = new Date();
// date.getFullYear()
// 如果不通过new实例对象,那么this指向调用者!!!
window.Human();
# JSON 对象
JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。 JSON 是 JS 对象的字符串表示法,它使用文本表示一个 JS 对象的信息,本质是一个字符串
var obj = { a: "Hello", b: "World" };
//这是一个对象,注意键名也是可以使用引号包裹的
var json = '{"a": "Hello", "b": "World"}';
//这是一个 JSON 字符串,本质是一个字符串
// 对象类型是不能通过网络进行传输的,只能是文本形式
// movie的json类型的对象
var movie = {
title: "我不是药神",
casts: [
{
name: "徐峥",
avatar: "http://xxxx.jpg",
age: 45,
},
{
name: "黄渤",
avatar: "http://xxxx2.jpg",
age: 42,
},
],
pubDate: "2017-10-1",
rate: 5,
};
console.log(movie);
// 1. 通过JSON.stringify(jsonObj) ==> 可以把json类型的对象转换为文本
var jsonStr = JSON.stringify(movie);
console.log(jsonStr);
//文本能转换为json对象吗?
//2. json字符串转换为对象
var movieStr = '{"name":"张三","age":20}';
// moveStr.name ==> 字符串不行!!
// JSON.parse ==> 字符串转换为对象
var movieObj = JSON.parse(movieStr);
console.log(movieObj);
//转换为对象 即可通过.的形式调用属性的值
console.log(movieObj.name);
// 对象和json类型的对象都可以通过 JSON.stringify() 转换为字符串,
// 但是如果希望字符串转换json对象 必须是json字符串
var user = {
name: "张三",
age: 20,
};
var userStr = JSON.stringify(user);
// {"name":"张三","age":20}
// {name:'张三',age:20}
console.log(userStr);
var str = "{name:'张三',age:20}";
var obj = JSON.parse(str);
console.log(obj);
# arguments 对象
- 函数的实参对象,只能在函数内部使用,类数组形式。
- arguments.length; 返回的是实参的个数。
- arguments.callee; 返回的是这个函数本身。在使用函数递归调用时推荐使用 arguments.callee 代替函数名本身。
# 对象原始值转换
← 排序和递归 数组和字符串常用方法 →