一、面向对象基本特征
封装:把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏。继承:通过继承创建的新类称为“子类”或“派生类”。多态:对象的多功能,多方法,一个方法多种表现形式。
二、操作对象的属性
- Object.defineProperty()方法会直接在一个对象上定义一个新属性,或者修改一个对象的现有属性,并返回此对象
如果想对一个属性进行比较精准的操作控制,就可以使用对象
属性描述符属性描述符:
- 数据属性描述符:4个特性
- configurable:表示属性可以通过delete删除属性,是否可以修改它的特性,是否可以将它修改为存取属性的描述符
- enumerable:表示属性是否可以通过for-in或Object.keys()返回该属性
- Writable:表示是否可以修改属性的值
- value:读取属性时会返回该值,修改属性时,会对其进行修改
- 存取属性描述符
//name和age虽然没有使用属性描述符来定义,但是它们也是具备对应的特性的
//value:赋值的value
//configurable: true
//enumerable: true
//writable: true
let obj = {
name: 'why',
age: '18'
}
//第一个参数: 选择要操作的对象
//第二个参数: 选择对象中要操作的属性
//第三个参数: 属性描述符(是个对象)
//返回值: 被传递给函数的对象
Object.defineProperty(obj,"height",{
//用了属性描述符则会有默认特性
value: 1.88, //默认值undefined
//该特性为false则为不可删除(delete obj.height)和修改及定义新的属性描述符
configurable: false, //默认值false
//该特性为false则是不可枚举
enumerable: false, //默认值false
//该特性是否可以写入值
writable: false, //默认值false
//getter :是一种获得属性值的方法
get: function(){
},
//setter:是一种设置属性值的方法
set: function(value){
}
})
console.log(obj);
三、 Object对象方法
Object.getOwnPropertyDescriptor:获取某一个特性属性的属性描述符
let obj = {
age: 18,
name: 'why'
}
console.log(Object.getOwnPropertyDescriptor(obj,"name"));
//{value: 'why', writable: true, enumerable: true, configurable: true}
Object.getOwnPropertyDescriptors:获取对象的所有属性描述符
let obj = {
age: 18,
name: 'why'
}
console.log(Object.getOwnPropertyDescriptors(obj))
//age: {value: 18, writable: true, enumerable: true, configurable: true}
//name: {value: 'why', writable: true, enumerable: true, configurable: true}
Object.preventExtensions:禁止对象继续添加新属性
let obj = {
age: 18,
name: 'why'
}
Object.preventExtensions(obj);
obj.height = 188
console.log(obj); //{age: 18, name: 'why'}
Object.seal:禁止对象配置/删除里面的属性
let obj = {
age: 18,
name: 'why'
}
Object.seal(obj);
delete obj.name;
console.log(obj); //{age: 18, name: 'why'}
Object.freeze:让属性不可修改(writable:false)
let obj = {
age: 18,
name: 'why'
}
Object.freeze(obj);
obj.name = 'newName';
console.log(obj); //{age: 18, name: 'why'}
Object.setPrototypeOf:为现有对象设置原型,返回一个新对象
let obj = {
name: 'why',
age: 18
}
let newObj = {}
console.log(Object.setPrototypeOf(newObj, obj));
Object.create:用于创建一个新对象,被创建的对象继承另一个对象的原型
let personObj = {
name: 'why',
age: 18
}
let stu = Object.create(personObj,{
address: {
value: '这是地址',
enumerable: true
}
})
console.log(stu);
hasOwnProperty():检测一个属性是否是对象的自有属性
let personObj = {
name: 'why',
age: 18
}
let stu = Object.create(personObj,{
address: {
value: '这是地址',
enumerable: true
}
})
console.log(stu.hasOwnProperty("name")); //false
console.log(stu.hasOwnProperty("address")); //true
in操作符:检测一个属性是否为该对象成员(不管在当前对象还是原型中)
//主体代码与上一致
console.log("name" in stu); //true