JS面向对象(一)-属性描述符

141 阅读3分钟

一、面向对象基本特征

  1. 封装:把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏。
  2. 继承:通过继承创建的新类称为“子类”或“派生类”。
  3. 多态:对象的多功能,多方法,一个方法多种表现形式。

二、操作对象的属性

  • Object.defineProperty()方法会直接在一个对象上定义一个新属性,或者修改一个对象的现有属性,并返回此对象

如果想对一个属性进行比较精准的操作控制,就可以使用对象属性描述符 属性描述符:

  • 数据属性描述符:4个特性
  1. configurable:表示属性可以通过delete删除属性,是否可以修改它的特性,是否可以将它修改为存取属性的描述符
  2. enumerable:表示属性是否可以通过for-in或Object.keys()返回该属性
  3. Writable:表示是否可以修改属性的值
  4. 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));

image.png

Object.create:用于创建一个新对象,被创建的对象继承另一个对象的原型

let personObj = {
    name: 'why',
    age: 18
}

let stu = Object.create(personObj,{
    address: {
        value: '这是地址',
        enumerable: true
    }
})
console.log(stu);

image.png

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