1 对象
1.1 什么是对象?
在JavaScript中,对象是一组无序的相关属性和方法的集合,所有的事物都是对象,例如字符串、数值、数组、函数等。
对象是由属性
和方法
组成的。
- 属性:事物的
特征
,在对象中用属性
来表示(常用名词) - 方法:事物的
行为
,在对象中用方法
来表示(常用动词)
1.2 为什么需要对象
保存一个值时,可以使用变量
,保存多个值(一组值)时,可以使用数组
。如果要保存一个人的完整信息呢?这时用JS的对象表达更清楚
2 创建对象的三种方式
在JavaScript中,现阶段我们可以采用三种方式创建对象(object) :
- 利用字面量创建对象
- 利用new Object创建对象
- 利用构造函数创建对象
2.1 利用字面量创建对象
对象字面量
:就是花括号{}里面包含了表达了这个具体事务(对象)的属性和方法
{}里面采取键值对
的形式表示
- 键:相当于属性名
- 值:相当于属性值,可以是任意类型的值(数字类型、字符串类型、布尔类型,函数类型等)
对象的调用
- 对象里面的属性调用:
对象.属性名
,这个小点.就理解为"的
" - 对象里面属性的另一种调用方式:
对象['属性名']
,注意方括号里面的属性必须加引号
- 对象里面的方法调用:
对象.方法名()
,注意这个方法名字后面一定加括号
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<script>
// 利用字面量创建对象
var obj = {}; // 创建了一个空的对象
var obj = {
uname: '张三丰',
age: 18,
sex: '男',
sayHi: function() {
console.log('hi~');
}
}
// (1) 里面的属性或者方法我们采取键值对的形式 键 属性名: 值 属性值
// (2) 多个属性或者方法中间用逗号隔开的
// (3) 方法冒号后面跟的是一个匿名函数
// 2. 使用对象
// (1) 调用对象的属性 我们采取 对象名.属性名 .我们理解为 的
console.log(obj.uname);
// (2)调用属性还有一种方法 对象名['属性名']
console.log(obj['age']);
// (3)调用对象的方法 sayHi 对象名.方法名 千万别忘记添加小括号
obj.sayHi();
</script>
</head>
<body>
</body>
</html>
变量、属性、函数、方法总结
- 变量:单独声明并赋值,单独存在
- 属性:对象里面的变量称为属性,不需要声明,用来描述该对象的特征
- 函数:单独存在的,通过“函数名()”的方式就可以调用
- 方法:对象里面的函数称为方法,方法不需要声明,使用“对象.方法名()”的方式就可以调用,方法用来描述该对象的行为和功能。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<script>
// 变量属性、函数、方法的区别
// 1. 变量和属性相同点 他们都是用来存储数据的
var num = 10;
var obj = {
age: 18,
}
console.log(obj.age);
// 变量 单独声明并赋值 使用的时候直接写变量名 单独存在
// 属性 在对象里面的不需要声明的 使用的时候必须是 对象.属性
// 2. 函数和方法的相同点 都是实现某种功能 做某件事
// 函数是单独声明 并且调用的 函数名()单独存在的
// 方法 在对象里面 调用的时候 对象.方法()
</script>
</head>
<body>
</body>
</html>
2.2 利用new Object创建对象
跟前面学的new Array()原理一致
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<script>
// 利用 new Object 创建对象
var obj = new Object(); // 创建了一个空的对象
obj.uname = '张三丰';
obj.age = 18;
obj.sex = '男';
obj.sayHi = function() {
console.log('hi~');
}
// (1)我们是利用 等号 = 赋值的方法 添加对象的属性和方法
// (2) 每个属性和方法之间用 分号结束
console.log(obj.name);
console.log(obj['sex']);
obj.sayHi();
</script>
</head>
<body>
</body>
</html>
2.3 利用构造函数创建对象
构造函数
:是一种特殊的函数,主要用来初始化对象,即为对象成员变量赋初始值,它总与new运算符一起使用。我们可以把对象中一些公共的属性和方法抽取出来,然后封装到这个函数里面。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<script>
// 因为前面两种创建对象一次只能创建一个对象
var ldh = {
uname: '刘德华',
age: 55,
sing: function() {
console.log('冰雨');
}
}
var zxy = {
uname: '张学友',
age: 58,
sing: function() {
console.log('李香兰');
}
}
// 因为我们一次创建一个对象,里面很多属性和方法是大量相同的 我们只能复制
// 因此我们可以利用函数的方法 重复这些相同的代码 我们就把这个函数称为构造函数
// 又因为这个函数不一样, 里面封装的不是普通代码,而是对象
// 构造函数就是把对象里面一些相同的属性和方法抽象出来封装到函数里面
</script>
</head>
<body>
</body>
</html>
eg:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<script>
// 利用构造函数创建对象
// 创建四大天王的对象 相同的属性: 名字 年龄 性别 相同的方法: 唱歌
// 构造函数的语法格式
// function 构造函数名() {
// this.属性 = 值;
// this.方法 = function() {}
// }
// new 构造函数名();
function Star(uname, age, sex) {
this.name = uname;
this.age = age;
this.sex = sex;
this.sing = function(sang) {
console.log(sang);
}
}
var ldh = new Star('刘德华', 18, '男'); // 调用函数返回的是一个对象
// console.log(typeof ldh);
console.log(ldh.name);
console.log(ldh['sex']);
ldh.sing('冰雨');
var zxy = new Star('张学友', 19, '男');
console.log(zxy.name);
console.log(zxy.age);
zxy.sing('李兰香');
// 1. 构造函数名字首字母大写
// 2. 构造函数不需要return 就可以返回结果
// 3. 我们调用构造函数必须使用new
// 4. 我们只要new Star() 调用函数就创建一个对象 ldh {}
// 属性和方法前面必须添加 this
</script>
</head>
<body>
</body>
</html>
练习
利用构造函数创建两个英雄对象。函数中的公共部分包括:姓名属性(name),类型属性(type),血量属性(blood)和攻击方式(attack).
- 廉颇 力量型 500血量 攻击:近战
- 后羿 射手型 100血量 攻击:远程
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<script>
function Hero(name, type, blood) {
this.name = name;
this.type = type;
this.blood = blood;
this.attack = function(attack) {
console.log(attack);
}
}
var lp = new Hero('廉颇', '力量型', '500');
var hy = new Hero('后羿', '射手型', '100');
lp.attack('近战');
hy.attack('远程');
</script>
</head>
<body>
</body>
</html>
2.4 构造函数和对象
- 构造函数,如Stars(),抽象了对象的公共部分,封装到了函数里面,它泛指某一大类(class)
- 创建对象,如new Stars(),特指某一个,通过new关键字创建对象的过程我们也称为对象实例化
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<script>
// 构造函数和对象
// 1. 构造函数 明星 泛指的某一大类 它类似于java语言里面的 类(class)
function Star(uname, age, sex) {
this.name = uname;
this.age = age;
this.sex = sex;
this.sing = function(sang) {
console.log(sang);
}
}
// 2. 对象 特指 是一个具体的事物 刘德华 == { name:'刘德华', age:18, sex:'男', sing: f }
var ldh = new Star('刘德华', 18, '男'); // 调用函数返回的是一个对象
console.log(ldh);
// 3. 我们利用构造函数创建对象的过程我们也称为对象的实例化
</script>
</head>
<body>
</body>
</html>
3 new关键字
new在执行时会做四件事情:
- 在内存中创建一个新的空对象
- 让this指向这个新的对象
- 执行构造函数里面的代码,给这个新对象添加属性和方法
- 返回这个新对象(所以构造函数里面不需要return)
4 遍历对象属性
for...in语句
用于对数组或者对象的属性进行循环操作
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<script>
// 遍历对象
var obj = {
name: 'pink老师',
age: 18,
sex: '男',
fn: function() {}
}
console.log(obj.name);
console.log(obj.age);
console.log(obj.sex);
// for in 遍历
// for (变量 in 对象) {
// }
for (var k in obj) {
console.log(k); // k 变量 输出 得到的是 属性名
console.log(obj[k]); // obj[k]得到的是 属性值
}
// 我们使用 for in 里面的变量 我们喜欢写k 或者 key
</script>
</head>
<body>
</body>
</html>
小结
- 对象可以让代码结构更清晰
- 对象复杂数据类型object
- 本质:对象就是一组无序的相关属性和方法的集合
- 构造函数泛指某一大类,比如苹果,不管是红色苹果还是绿色苹果.都统称为苹果
- 对象实例特质一个事物
- for…in语句用于对对象的属性进行循环操作
作业1
- 创建一个电脑对象,该对象要有颜色、重量、品牌、型号,可以看电影、听音乐打游戏和敲代码。
- 创建一个按钮对象,该对象中需要包含宽,高,背景颜色和点击行为。
- 创建一个车的对象,该对象要有重量、颜色、牌子,可以载人拉货和耕田。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<script>
// 1.
function Computer(color, weight, brand, type) {
this.color = color,
this.weight = weight,
this.brand = brand,
this.type = type,
this.listen = function(music) {
console.log(music);
}
this.game = function(game) {
console.log(game);
}
this.code = function(code) {
console.log(code);
}
}
var computer = new Computer('red', 20, '华为', 'xx');
computer.listen('华尔兹');
// 2.
function Button(width, height, backcolor) {
this.width = width;
this.height = height;
this.backcolor = backcolor;
this.click = function(aru) {
console.log(aru);
}
}
var button = new Button(20, 10, 'yellow');
button.click('消失');
// 3.
function Car(weight, color, brand) {
this.weight = weight;
this.color = color;
this.brand = brand;
this.zairen = function() {
console.log('可以载人');
}
this.lahuo = function() {
console.log('可以拉货');
}
this.gengtian = function() {
console.log('可以耕田');
}
}
var car = new Car(100, 'black', '奔驰');
car.zairen();
</script>
</head>
<body>
</body>
</html>
作业2
- 写一个函数,实现反转任意数组。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<script>
function reverse(arr) {
newArr = [];
for (var i = arr.length - 1; i >= 0; i -- ) {
newArr[newArr.length] = arr[i];
}
return newArr;
}
var arr1 = [3, 7, 5, 66, 21, 2];
console.log(reverse(arr1));
</script>
</head>
<body>
</body>
</html>
- 写一个函数,实现对数字数组的排序。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<script>
function sort(arr) {
for (var i = 0; i < arr.length - 1; i ++ ) {
for (var j = 0; j < arr.length - i - 1; j ++ ) {
if (arr[j] > arr[j + 1]) {
var temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
return arr;
}
var arr1 = sort([5, 1, 3, 7, 2]);
console.log(arr1);
</script>
</head>
<body>
</body>
</html>
小项目:做一个简易计算器
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<script>
var choice = parseInt(prompt('欢迎使用简易计算器:\n1.加法运算;\n2.减法运算;\n3.乘法运算;\n4.除法运算;\n5.退出;\n请输入您的选项:'));
while (choice != 5) {
var a = prompt('请输入一个数值:');
var b = prompt('请输入一个数值:');
var res;
switch(choice) {
case 1:
res = parseInt(a) + parseInt(b);
alert(res);
break;
case 2:
res = parseInt(a) - b;
alert(res);
break;
case 3:
res = parseInt(a) * b;
alert(res);
break;
case 4:
res = parseInt(a) / b;
alert(res);
break;
default:
break;
}
choice = parseInt(prompt('欢迎使用简易计算器:\n1.加法运算;\n2.减法运算;\n3.乘法运算;\n4.除法运算;\n5.退出;\n请输入您的选项:'));
}
</script>
</head>
<body>
</body>
</html>