对象
现实生活中的对象:万物皆对象,对象是一个具体的事物,一个具体的事物就会有行为和特征。
JavaScript 中的对象: JavaScript 中的对象其实就是生活中对象的一个抽象。 JavaScript 的对象是无序属性的集合。
其属性可以包含基本值、对象或函数。对象就是一组没有顺序的值。我们可以把 JavaScript 中的对象想象成键值对,其中值可以是数据和函数。
对象的行为和特征: 特征—在对象中用属性表示;行为—在对象中用方法表示
对象字面量***
创建一个对象最简单的方式是使用对象字面量赋值给变量。类似数组。
对象字面量语法:{}
- 内部可以存放多条数据,数据与数据之间用逗号分隔,最后一个后面不要加逗号。
- 每条数据都是有属性名和属性值组成,键值对写法:k: v
- k: 属性名
- v:属性值,可以是任意类型的数据,比如简单类型数据、函数、对象
var obj = {
k: v,
k: v,
k: v
};
// 创建单个对象而不是一类对象时使用这种方法
// 通过对象字面量方式创建一个对象
var person1 = {
name: 'zs',
age: 18,
sex: 'male',
sayHi: function () { // 匿名函数
console.log(this.name + "向你说您好");
}
};
// 调用对象内部属性和方法
console.log(person1.name);
console.log(person1["name"]);
person1.sayHi();
person1["sayHi"]();
// 更改数据
person1.age = 22;
// 添加数据
person1.height = 180;
// 删除数据
delete person1.sex;
注意:小括号是运算符,中括号是数组的字面量,大括号是对象的字面量。
属性与方法
属性:对象的描述性特征,一般是名词,相当于定义在对象内部的变量。
方法:对象的行为和功能,一般是动词,定义在对象中的函数。
1.调用对象内部属性和方法的语法
- 用对象的变量名打点调用某个属性名,得到属性值。
console.log(o.name);
- 在对象内部用 this 打点调用属性名。this 替代对象。
- 用对象的变量名后面加 [] 调用,[] 内部是字符串格式的属性名。
console.log(o['age']);
o['sayHi']();
- 调用方法时,需要在方法名后加 () 执行。
o.sayHi();
2. 更改对象内部属性和方法的语法
- 更改属性的属性值方法:先调用属性,再等号赋值。
o.age = 19;
- 增加新的属性和属性值:使用点语法或者[]方法直接定义新属性,等号赋值。
o.height = 180;
- 删除一条属性:使用一个 delete 关键字,空格后面加属性调用。
delete o.sex;
变量、属性、函数、方法的总结
-
变量:单独声明赋值,单独存在
-
属性:对象里面的变量称为属性,不需要声明,用来描述该对象的特征
-
函数:单独存在的,通过“函数名()”的方式就可以调用了
-
方法:对象里面的函数称为方法,方法不需要声明,使用“对象.方法名()”的方式就可以调用了,方法用来描述该对象的行为和功能
其他创建对象的方法
1. new Object() 创建对象
Object() 构造函数 ,是一种特殊的函数。主要用来在创建对象时初始化对象, 即为对象成员变量赋初始值,总与 new 运算符一起使用在创建对象的语句中。
- 构造函数用于创建一类对象,首字母要大写。
- 构造函数要和 new 一起使用才有意义
var person1 = new Object(); // 创建一个新的空对象
person1.name = "zs";
person1.age = 22;
person1.sex = true;
person1.sayHi = function () {
console.log(this.name + "您好");
};
console.log(person1.name);
console.log(person1["age"]);
person1.sayHi();
* new 在执行时会做四件事情
- new 会在内存中创建一个新的空对象
- new 会让 this 指向这个新的对象
- 执行构造函数 目的:给这个新对象加属性和方法
- new 会返回这个新对象
2. 工厂函数创建对象
如果要创建多个类似的对象,可以将 new Object() 过程封装到一个函数中,将来调用函数就能创建一个对象,用来简化代码
把对象里一些相同的属性和方法抽取出来封装到函数里面
// 工厂方法就是相当于对new Object() 方法的一个封装
function createPerson(name, age, sex) {
// 创建一个空的对象
var person = new Object();
// 添加属性名和方法 属性可以接收参数的值
person.name = name;
person.age = age;
person.sex = sex;
person.sayHi = function () {
console.log(this.name + "您好");
};
// 将对象作为函数的返回值
return person;
}
// 想创建一个对象 可以调用工厂函数
var p1 = createPerson("zs", 19, true);
var p2 = createPerson("ls", 20, false);
console.log(p1);
console.log(p2);
console.log(p2.sayHi());
3. 自定义构造函数***
比工厂方法更加简单。
-
自定义一个创建具体对象的构造函数,函数内部不需要 new 一个构造函数的过程,直接使 用 this 代替对象进行属性和方法的书写,也不需要 return 一个返回值。
-
使用时,利用 new 关键字调用自定义的构造函数即可。
-
注意:构造函数的函数名首字母需要大写,区别于其他普通函数名
// 自定义一个构造函数
// 构造函数首字母要大写
function Person(name, age, sex) {
// 不需要使用 new一个新对象
// 用this 替代将来创建的新对象
this.name = name;
this.age = age;
this.sex = sex;
this.sayHi = function () {
console.log("hello");
};
this.likeColor = function (color) {
console.log(color);
};
// 不需要添加return
}
// 在这里用 new 关键字调用构造函数创建一个新的对象
var p1 = new Person("zs", 22, true);
p1.sayHi();
console.log(p1.name);
console.log(p1);
p1.likeColor("blue");
对象遍历
for in 循环也是循环的一种,专门用来遍历对象,内部会定义一个 k 变量, k 变量在每次循环时会从第一个开始接收属性名,一直接收到最后一条属性名,执行完后跳出循环。
简单的循环遍历:输出每一项的属性名和属性值。
// 循环遍历输出每一项
for (var k in person1) {
// k 存储的是每一条数据的属性名或方法名
// 如果是person1.k,会当作是person1里面有个 k
// person1[k] 把 k 当作一个变量传入中括号中,这样会接收到变量名的一个字符串
console.log(k + "属性的属性值为" + person1[k]);
}