对象

对象

何为对象:万物皆对象 客观世界中的具体的实体就是对象 如 一个人 一个气球 一辆汽车 每一个对象实体都有对应的特征

思考:

咱们班的班主任这个对象怎么描述  特征  行为

为什么要学习对象?

思考:上述对象都是客观世界的,那JS这门语言中为什么要有对象呢 又如何用代码去描述一个对象呢

数组:是有序的元素集合 ,数组用于存放一组数据,比如一个班级所有人的名字,一个班级所有人的成绩。

函数:封装一段重复的代码,只要声明一次,就可以多次调用。

思考1:如果要存储一个人的信息,应该怎么办?
var name = "张三";
var age = 18;
var sex = "男";
var hobby = "上网";
思考2:这么做的缺点是什么?
这些变量都是属于一个人的,应该跟数组一样,使用一个集合把所有的信息都存储起来。
但是如果用数组存的话数据信息不明确,所以可以使用对象来存储

对象:是一组无序的键值对的集合。

  • 事物的特征在对象中用属性来表示。
  • 事物的行为在对象中用方法来表示。
//数组多个元素之间使用,隔开
//对象中多个键值对之间也用,隔开,键值对的格式: 键:值
var obj = {
  name:"张三",
  age:18,
  gender:"男",
  hobby:"上网",
  greet: function() {
    console.log('你好呀!!');
  }
}

操作对象

操作对象: 增 删 改 查

查语法: 对象.属性
console.log(obj.name);
console.log(obj.age);

改语法: 对象.属性 = 新的值;
obj.name = 'ls';
obj.age = 38;

增语法: 和改语法是一样的, 如果该属性是存在的就是改  如果不存在就是添加
obj.girlFriend = 'wmz';

删除语法: delete 对象.属性
delete obj.girlFriend

创建对象

字面量的形式 11 “abc” true [] {}等

var o = {
  name : "zs",
  age : 18,
  sex : true,
  sayHi : function() {
    console.log(this.name);
  }
};

通过Object构造函数创建

var obj = new Object();
obj.name = 'zs';
obj.age = 18;
obj.gender = 'male';

批量创建对象

在实际开发中,经常需要创建多个相同类型的对象,比如游戏中的怪物,班级的学生等。

需求: 学生管理系统 => 创建60个学生对象 每一个学生对象都有如下属性

姓名 性别 学历 成绩 性格

使用工厂函数创建对象

// 上述都是重复去做一件事情 重复去做一件事情 我们就可以利用function封装 然后重复调用 传递对应的参数
function createStudent(name, gender, degree, score, trait) {
    var student = {
        name: name,
        gender: gender,
        degree: degree,
        score: score,
        trait: trait
    };

    return student;
}
var ff = createStudent('飞飞', 'male', '家里蹲', 100, '外向');

优点:可以同时创建多个对象
缺点:麻烦,并且没有原型关系(JS高级精讲)同时没有类型

构造函数 和 new运算符

// 构造函数名字大写
function Student(name, gender, degree, score, trait) {
    this.name = name;
    this.gender = gender;
    this.degree = degree;
    this.score = score;
    this.trait = trait;
}
var hg = new Student('飞飞', 'male', '家里蹲', 100, '外向');

new 运算符

  • 创建一个新的对象 类型从属于对应的构造函数
  • 将this指向这个新对象
  • 执行构造函数
  • 返回这个新对象

new运算符一般配合构造函数使用 这种方式创建对象更加简单。并且有原型关系(JS高级精讲)可以看到数据类型

工厂函数和new创建对象的区别
工厂函数: 类型不够明确  所有的对象都是object类型
需要手动var一个新对象
需要手动return这个对象

构造函数: 类型明确 
不需要手动var
不需要手动return 
一切交给new 

[]语法操作对象属性

对象[“属性名”]

// 访问对象属性的一个语法
// 对象名.属性名
// 对象名[属性名]

var obj = {
    name: 'zs',
    age: 18,
    i: 1
};

// 共同点: 都可以访问对象的属性
console.log(obj.name); // zs
console.log(obj['name']); // zs

// 不同点:
// 点语法不能解析变量
// []语法可以解析变量  如果想要[]语法解析变量 那么[]里面不能再添加引号了
var i = 'age';

console.log(obj.i); // .语法不能解析变量
console.log(obj['i']); // 1
console.log(obj[i]); // 18

// 小结一下
// 相同点: 都可以访问对象的属性  对象名.属性名 === 对象名['属性名']
// 不同点: []语法里面的值如果不添加引号 默认解析的是这个变量

总结:

  • 如果对象的属性存在-这种的 那么使用.语法无法操作 但是[]形式可以
  • []语法可以使用变量代替属性 但是.语法不可以 如果[]语法里面的值添加了引号 那么就和.语法一样

遍历对象

for遍历的问题:

  • 对象的长度 也就是说循环多少次
  • 获取对象里面的具体属性

通过for in语法

var obj = {
    name: 'feifei',
    age: 15,
    gender: 'male'
};

/*for(var i = 0; i < 3; i++){
    obj[0]
  };*/

// for循环遍历对象的两个问题:
// 1. 对象没有自动维护的length属性
// 2. 对象没有类似于数组的下标

for(var attr in obj){
    // console.log('1');
    // console.log(attr);
    console.log(obj[attr]);
}

引用数据类型和值数据类型 (重要)

问题:
// var a = 1;
// var b = a;
// a = 2;
// console.log(b); // 1

var a = {
name: 'zs',
age: 18
};

var b = a;
a.name = 'ls';
console.log(b.name); 

简单数据类型(值类型)
在存储时,变量中存储的是值本身,因此叫做值类型。
如:number string boolean undefined null
复杂数据类型 (引用类型)
array object function
在存储时,变量中存储的仅仅是地址(引用),因此叫做引用数据类型

思考题:

//1.
function Person(name, age) {
    this.name = name;
    this.age = age;
}
var p1 = new Person("zs", 18);
var p2 = p1;
p2.name = "ls";
console.log(p1.name);
console.log(p2.name);

//2.
function Person(name, age) {
  this.name = name;
  this.age = age;
}
function f1(p) {
  p.name = "ls";
  console.log(p.name);
}
var p1 = new Person("zs", 18);
console.log(p1.name);
f1(p1);
console.log(p1.name);

结论:简单类型存储的是值本身,复杂类型存储的是地址,如果把第一个对象赋值给另一个变量,此时两个变量会指向同一个对象。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值