1、let 和const
(1)let:用来声明块级变量。var声明的变量会出现作用域的提升(会出现变量的污染)
(2)const:声明的常量必须要初始化
(3)const声明的对象:常对象
a、可以修改对象的属性值,但是不能修改对象本身
const obj = {
name:'张三',
age:25
}
obj.name = '李四' //正确的:修改对象的属性
obj = {} // 错误的:不能改变对象
b、冻结对象:不能修改对象的属性。使用Object.freeze(对象名)
const obj = {
name:'李四',
age: 25
}
console.log(obj)
Object.freeze(obj) //冻结对象obj,就不能修改obj的属性
obj.name = '王五'
console.log(obj)
c、冻结嵌套的对象
const p = {
name:'李四',
age: 25,
family:{
father:'李世民',
mother:'长孙皇后'
}
}
//定义一个冻结函数
function fun(obj){ //函数的参数是对象
//1.冻结对象:参数接收的对象
Object.freeze(obj)
//2.使用for...in循环遍历对象的属性
for(let key in obj){ //key = 'mother'
//2.1 hasOwnProperty用来判断对象是否包含给定的属性。typeyof用来判断数据类型
if(obj.hasOwnProperty(key) && typeof obj[key] === 'object'){// obj['mother'] -- string
fun(obj[key])
}
}
}
fun(p)
p.family.father = '李建成'
console.log(p)
2、构造函数:
1)作用:初始化对象(是对象的模型),所有的对象都是用这个模型造出来的
(2)this:指向由构造函数创建的对象(代表当前对象)
(3)对象:是属性和行为的结合体
属性:是对象的静态特征(成员变量)
行为:是对象的动态特征(函数 / 方法)
<script>
/*需求:定义构造函数Student,属性分别是:id、name、html、css、JavaScript
(1)创建5个Student对象,把这5个对象存入数组
(2)找出总成绩最高的对象
(3)根据javascript成绩对数组进行降序排序
*/
//1.定义构造函数
function Student(id,name,html,css,javascript){
//1.1 定义属性:this后的是属性
this.id = id
this.name = name
this.html = html
this.css = css
this.javascript = javascript
//1.2 定义方法:求对象的总成绩
this.total = function(){
return this.html + this.css + this.javascript
}
}
//2.创建对象,然后将对象存入数组
let s1 = new Student(101,'贾宝玉',78,85,95)
let s2 = new Student(102,'贾元春',65,88,98)
let s3 = new Student(103,'贾探春',75,65,88)
let s4 = new Student(104,'贾迎春',90,80,92)
let s5 = new Student(105,'贾惜春',72,78,86)
let arr = [s1,s2,s3,s4,s5] //arr数组称为对象数组
console.log(arr)
//3. 找总成绩最高的
let max = arr[0] //假定数组中第一个对象的总成绩最高
for(let i=1;i<arr.length;i++){
if(arr[i].total() > max.total()){
max = arr[i]
}
}
console.log("总成绩最高的是:",max)
//4.按JavaScript的成绩进行降序排序
for(let i=0;i<arr.length;i++){
for(let j=0;j<arr.length-1;j++){
if(arr[j].javascript < arr[j+1].javascript){
let t = arr[j]
arr[j] = arr[j+1]
arr[j+1] = t
}
}
}
console.log(arr)
</script>