JavaScript基础Day05:对象
文章目录
一、对象
JavaScript的对象是无序属性的集合。其属性可以包含基本值、对象或函数。对象就是一组没有顺序的值。我们可以把JavaScript中的对象想象成键值对,其中值可以是数据和函数。(特征—属性 行为—方法)
1. 创建对象
- 通过系统的构造函数创建对象:var obj = new Object();
- 自定义构造函数创建对象
- 通过字面量创建对象
2. 自定义构造函数创建对象
- 申请空闲空间,存储创建的对象
- 把this设置为当前对象
- 设置对象的属性和值
- 把this这个对象返回
- demo01:自定义构造函数创建对象
//自定义构造函数
function Person(name, age) {
this.name = name;
this.age = age;
this.sayHi = function () {
console.log(name + "," + age); //haha,18
}
}
var obj1 = new Person("haha", 18); //创建对象
obj1.sayHi();
console.log(obj1 instanceof Person); //true
3. 通过字面量创建对象
- demo02:通过字面量创建对象
var obj1 = {}; //跟字面量创建数组一样的思路
obj1.name = "嘻嘻";
obj1.age = 18;
obj1.eat = function () {
console.log(this.name + "在吃东西"); //嘻嘻在吃东西
};
obj1.eat();
- demo03:优化字面量方法创建对象
var obj2 = {
name: "哈哈",
age: 20,
eat: function () {
console.log(this.name + "在吃东西"); //哈哈在吃东西
}
};
4. new关键字
构造函数 ,是一种特殊的函数。主要用来在创建对象时初始化对象, 即为对象成员变量赋初始值,总与new运算符一起使用在创建对象的语句中。
- 构造函数用于创建一类对象,首字母要大写。
- 构造函数要和new一起使用才有意义。
new在执行时会做四件事情:
new会在内存中创建一个新的空对象;
new会让this指向这个新的对象;
执行构造函数目的:给这个新对象加属性和方法;
new会返回这个新对象。
5. this关键字
- 函数在定义的时候this是不确定的,只有在调用的时候才可以确定
- 一般函数直接执行,内部this指向全局window
- 函数作为一个对象的方法,被该对象所调用,那么this指向的是该对象
- 构造函数中的this其实是一个隐式对象,类似一个初始化的模型,所有方法和属性都挂载到了这个隐式对象身上,后续通过new关键字来调用,从而实现实例化
二、对象的使用
1. 获取属性(两种写法)
function Person(name, age) {
this.name = name;
this.age = age;
this.eat = function () {
console.log("我来吃饭啦");
}
}
- 正常访问获取:对象.属性
var obj1 = new Person("哈哈", 18);
console.log(obj1.name); //哈哈
console.log(obj1.age); //18
obj1.eat(); //我来吃饭啦
- 另一种写法:对象[“属性”]
var obj2 = new Person("嘻嘻");
obj2["age"] = 20;
console.log(obj2["name"]); //嘻嘻
console.log(obj2["age"]); //20
obj2["eat"](); //我来吃饭啦
2. 遍历对象的属性:使用for-in语法
- demo04:遍历对象的属性
var obj = {
name: "哈哈",
age: 20
};
for (var key in obj) {
console.log(key+"--"+obj[key]);
}
//结果:
// name--哈哈
// age--20
3. 简单类型和复杂类型
基本类型又叫做值类型,复杂类型又叫做引用类型
值类型:简单数据类型,基本数据类型,在存储时,变量中存储的是值本身,因此叫做值类型。(存在与堆中)
引用类型:复杂数据类型,在存储是,变量中存储的仅仅是地址(引用),因此叫做引用数据类型。(对象存在于堆,地址存在于栈)
-
堆和栈
堆栈空间分配区别: 1、栈(操作系统):由操作系统自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈; 2、堆(操作系统): 存储复杂类型(对象),一般由程序员分配释放, 若程序员不释放,由垃圾回收机制回收,分配方式倒是类似于链表。
-
注意:JavaScript中没有堆和栈的概念,此处我们用堆和栈来记录,目的方便理解和学习。
- demo05:练习复杂类型
function Person(name, age, salary) {
this.name = name;
this.age = age;
this.salary = salary;
}
function f1(person) {
person.name = "ls";
person = new Person("aa", 18, 10);
}
var p = new Person("zs", 18, 1000);
console.log(p.name); //zs
f1(p); //使用p对象作为参数传入函数f1中,person.name重新赋值为ls
console.log(p.name); //ls
//1.
var num1 = 10;
var num2 = num1;
num1 = 20;
console.log(num1); //20
console.log(num2); //10
//2.
var num = 50;
function f1(num) {
num = 60;
console.log(num); //60
}
f1(num);
console.log(num); //50,函数中的num是参数传递,num=60是局部变量
//3.
var num1 = 55;
var num2 = 66;
function f1(num, num1) {
num = 100;
num1 = 100;
num2 = 100;
console.log(num); //100
console.log(num1); //100
console.log(num2); //100
}
f1(num1, num2);
console.log(num1); //55
console.log(num2); //100
console.log(num); //报错