类和对象进阶
值类型和引用类型
// 值类型:string,number,boolean
let num1 = 100
let num2 = num1 //num2的值由num1传入
console.log(`num1=${num1},num2=${num2}`);
num2 = 200 //num2的值重新修改后,num1不受影响
console.log(`num1=${num1},num2=${num2}`);
console.log('--------------------------------------');
// 引用类型:数组,对象
let obj1 = {
name:'张杰',
age:20,
sex:'男'
}
// 将obj1传给obj2,其实传的是obj1的地址
let obj2 = obj1
console.log('obj1',obj1);
console.log('obj2',obj2);
console.log('------');
//修改obj2的属性值,obj1也会发生变化,因为obj1和obj2的地址是一样的。
// 值类型在调用方法传递是,传的是值
//数组是引用类型
原型对象
// 构造函数(类)有原型对象,其实就是构造函数身上的一个自带属性,这个属性是:prototype
// 对象也有原型对象,其实就是对象身上的一个自带属性,这个属性是:__proto__
// 所有同类型的对象身上的原型对象属性,都指向类的原型对象属性。
// 类和对象的原型对象身上挂的方法,对象可以直接使用,不需要经过原型对象。
function Student(name,age,sex){
this.name = name
this.age = age
this.sex = sex
// 如果将方法直接定义在类里面,将来根据这个类创建的每个对象,都要创建自己独立的这些方法
// 如果要创建很多对象,对内存的开销会很大。
/* this.sayHi = function(){
console.log(`Hi!我叫${this.name},今年${this.age}岁,性别是${this.sex}`);
}
this.study = function(time){
console.log(`Hi!我叫${this.name},我每天学习${time}小时`);
}
this.play = function(time){
console.log(`Hi!我叫${this.name},我每天玩${time}小时`);
} */
}
// 我们可以将类的方法,添加到类的原型对象身上
Student.prototype.sayHi = function(){
console.log(`Hi!我叫${this.name},今年${this.age}岁,性别是${this.sex}`);
}
Student.prototype.study = function(time){
console.log(`Hi!我叫${this.name},我每天学习${time}小时`);
}
Student.prototype.play = function(time){
console.log(`Hi!我叫${this.name},我每天玩${time}小时`);
}
let s1 = new Student('张三',20,'男')
let s2 = new Student('李四',22,'女')
let s3 = new Student('王五',24,'男')
// 查了Student类的原型对象
// console.log(Student.prototype);
// 查看三个对象的原型对象 -- 你会发现,长得一样。
// console.log(s1.__proto__);
// console.log(s2.__proto__);
// console.log(s3.__proto__);
s1.sayHi()
s1.study(8)
s1.play(3)