美文网首页
JS面向对象

JS面向对象

作者: LcoderQ | 来源:发表于2024-06-11 17:14 被阅读0次

    一、对对象属性的操作(defineProperties)

    • Object.defineProperty () 和Object.defineProperties()方法会直接在一个对象上定义一个新属性,或者修改一个对象的现有属性,并返回此对象
    • Object.defineProperty(obj, prop, descriptor)接受三个参数,返回传递给函数的对象(obj),因此不是一个纯函数
      obj要定义属性的对象
      prop要定义或修改的属性的名称或symbol
      descriptor要定义或修改的属性描述符

    属性描述符:
    数据属性(Data Properties)描述符(Descriptor);
    存取属性(Accessori访问器Properties)描述符(Descriptor);


    属性描述符.png

    Configurable:表示属性是否可以通过deletef删除属性,是否可以修改它的特性,或者是否可以将它修改为存取属性
    描述符;

    • 当我们直接在一个对象上定义某个属性时,这个属性的[Configurable]为true;
    • 当我们通过属性描述符定义一个属性时,这个属性的[Configurable]默认为false;

    Enumerable:表示属性是否可以通过for-in或者Object.keys0返回该属性;

    • 当我们直接在一个对象上定义某个属性时,这个属性的[Enumerable]为true;
    • 当我们通过属性描述符定义一个属性时,这个属性的[Enumerable]默认为false;

    Writable:表示是否可以修改属性的值;

    • 当我们直接在一个对象上定义某个属性时,这个属性的[Writable]为true;
    • 当我们通过属性描述符定义一个属性时,这个属性的[Writable]默认为false;

    value:属性的value值,读取属性时会返回该值,修改属性时,会对其进行修改;
    口默认情况下这个值是undefined;
    ps:value、writable、get、set不能共存

    使用示例

    const object1 = {};
    Object.defineProperty(object1, 'property1', {
      value: 42,
      writable: false,
    });
    
    object1.property1 = 77;
    // Throws an error in strict mode
    
    console.log(object1.property1);
    // Expected output: 42
    
    const obj = {};
    Object.defineProperties(obj, {
      property1: {
        value: true,
        writable: true,
      },
      property2: {
        value: "Hello",
        writable: false,
      },
      // 等等……
    });
    

    二、对象的创建

    1、工厂模式

    function createPerson(name,age,height,address){
      var p = {}
      p.name= name
      p.age= age
      p.height=height
      p.address= address
      p.eating= function(){
      console.Log(this.name+,"在吃东西~")}
      p.running= function(){
      console.log(this.name+."在跑步~")}
      return p
    }
    

    工厂模式的缺点:

    • 拿不到对象的类型
    • 每一个对象都有属性自己的方法,没有公共的部分

    2、构造函数

    • 使用new关键字来调用一个函数,则这个函数就是一个构造函数,使用该构造函数的函数执行流程
      1.在内存中创建一个新的对象(空对象);
      2.这个对象内部的[prototype]属性会被赋值为该构造函数的porototype属性
      3.构造函数内部的this,会指向创建出来的新对象;
      4.执行函数的内部代码(函数体代码)
      5.如果构造函数没有返回非空对象,则返回创建出来的新对象;
    • 约定如果想把一个函数作为构造函数来使用,则将函数的首字母大写
    function Person(name, age, height, address) {
      this.name = name;
      this.age = age;
      this.height = height;
      this.address = address;
      this.eating = function () {
        console.log(this.name + "在吃东西~");
      };
      this.running = function () {
        console.log(this.name + "在跑步");
      };
    }
    varp1 = new Person("张三", 18, 1.88, "广州市");
    

    构造函数的缺点:

    • 每一个对象都有属性自己的方法,没有公共的部分(可使用原型来优化)

    相关文章

      网友评论

          本文标题:JS面向对象

          本文链接:https://www.haomeiwen.com/subject/optgqjtx.html