# 对象初识

# 对象简介

对象的作用是:封装信息**。比如 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。比如consoledocument

    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 代替函数名本身。

# 对象原始值转换

上次更新: 9/2/2019, 5:09:05 PM