Object .keys获取当前对象中的属性名,返回值是一个数组
// 用于获取对象自身的所有属性
var obj = {
id: 1,
name: '牛牛',
price: 1000,
num: 200,
}
var arr = Object.k eys(obj)
console.log(arr)
Object.difineproperty设置或者修改对象中的属性
// Object.difineproperty设置或者修改对象中的属性
var obj = {
id: 1,
name: '小米手机',
price: 1999,
}
// 以前给对象添加或修改属性的方法
// obj.num = 1000
// obj.price = 99
// console.log(obj)
// Object.difineproperty定义新属性
Object.defineProperty(obj, 'num', {
value: 1200,
// 允许遍历 如果值为false 不允许遍历
enumerable: true,
})
// console.log(obj)
// 修改属性
Object.defineProperty(obj, 'price', {
value: 9.9,
})
// console.log(obj)
Object.defineProperty(obj, 'id', {
// 值为false 不允许修改这个属性值 默认值为false
writable: false,
})
obj.id = 2
// console.log(obj)
Object.defineProperty(obj, 'address', {
value: '北京昌平',
// 值为false 不允许修改这个属性值 默认值为false
writable: false,
// 允许遍历 如果值为false 不允许遍历 默认值为false
enumerable: false,
// 如果为false 不允许删除这个属性 不允许再修改第三个参数里面的特性 默认为false
configurable: false,
})
console.log(obj)
console.log(Object.keys(obj))
delete obj.address
console.log(obj)
delete obj.name
console.log(obj)
面向过程是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候再一个一个的依次调用就行了
面向对象是把事务分解成一个一个对象,然后由对象之间分工与合作
衣服
人
洗衣机
面向过程: 不易维护,不易复用
面向对象: 易维护,易复用,面向对象有封装,继承,多态的特性,使系统更加灵活
在ES6中新增加了类的概念,可以用class关键字声明一个类,之后用这个类来实例化对象,类抽象了对象的公共部分,指某一大类对象,通过实例化一个具体的对象
类是构造函数的语法糖(简写)
语法
// 1 使用class关键字 class 类名{}
class Star {}
// 2使用定义的类创建实例 使用new关键字
var s = new Star()
代码
// // 1 使用class关键字 class 类名{}
// class Star {}
// // 2使用定义的类创建实例 使用new关键字
// var s = new Star()
// 创建类 创建一个明星类
class Star {
// 类的共有属性放到 constructor
// 类实例化对象时候执行constructor
// constructor 是构造器 或者构造函数
constructor(name, age) {
this.name = name
this.age = age
}
}
var ldh = new Star('刘德华', 18)
console.log(ldh)
// 结果 类创建的对象 和构造函数创建对象的结果是一样的
// 创建类 创建一个明星类
class Star {
// 类的共有属性放到 constructor
// 类实例化对象时候执行constructor
// constructor 是构造器 或者构造函数
constructor(name, age) {
this.name = name
this.age = age
}
// ---类里面所有的函数不需要写function
// ----多个函数之间不需要添加逗号分割
sing(song) {
console.log(this.name + song)
}
}
var ldh = new Star('刘德华', 18)
var zxy = new Star('张学友', 20)
// console.log(ldh)
ldh.sing('冰雨')
zxy.sing('李香兰')
// 结果 类创建的对象 和构造函数创建对象的结果是一样的
语法
class Father{
//父类
}
class Son extends Father{
//子类继承父类
}
// super 关键字调用父类普通函数
// class Father {
// constructor(x, y) {
// this.x = x
// this.y = y
// }
// say() {
// return '我是爸爸'
// }
// }
// class Son extends Father {
// say(x, y) {
// // super(x, y) //调用了父类中的普通函数
// console.log('我是儿子')
// console.log(super.say() + '的儿子')
// }
// }
// var son = new Son()
// son.say()
// 继承中属性或者方法的查找原则 就近原则
// 继承中,如果实例化子类输出一个方法,先看子类有没有这个方法,如果有就先执行子类的
// 继承中,子类没有,就去查找父类有没有这个方法,如果有就去执行父类的方法
// 如果子类想要继承父类的方法,同时在自己内部扩展自己的方法,利用super调用父类的构造函数,必须在
// 子类this之前调用
class Father {
constructor(x, y) {
this.x = x
this.y = y
}
say() {
console.log('我是爸爸')
return '我是爸爸'
}
}
class Son extends Father {
constructor(x, y) {
super(x, y)
}
// say() {
// console.log('say')
// }
}
var s = new Son(34, 4)
s.say()
// this指向问题 类里面共有的属性和方法 一定要加this使用
// 1constructor中的this指向new出来的实例对象
// 2 自定义方法 一般也指向new出来的实例对象