zoukankan      html  css  js  c++  java
  • JavaScript中get和set访问器的实现

    在学习Vue的时候我们知道它的响应式数据原理就是通过Object.defineProperty进行重写定义的,主要是利用getset属性访问器实现的,接下来看看get和set属性访问器的实现原理

    1.ES6的实现方法

    js允许在运行时向对象添加状态,并且可以添加行为。为了提高抽象能力,js的属性被设计成了更加复杂的形式,它提提供了两类属性getter/setter,作为其数据属性和访问器属性。也可以简单的理解为,getter 是一种获得属性值的方法,setter是一种设置属性值的方法。

    • getter负责查询值,它不带任何参数,setter则负责设置键值,值是以参数的形式传递,在他的函数体中,一切的return都是无效的
    • get/set访问器不是对象的属性,而是属性的特性,特性只有内部才用,因此在javaScript中不能直接访问他们,为了表示特性是内部值用两队中括号括起来表示如[[Value]]
    class Person {
        constructor(name,age) {
            this.name = name;
            this.age = age;
        }
                    
        set name(name) {
            console.log("setter");
            this.name = name;
        }
                    
        get name() {
            console.log("getter");
            return this.name;
        }
    }

    2.Object.defineProperty

    Object.defineProperty(obj,prop, descriptor)

    参数:

    • obj:目标对象,
    • prop:需要定义的属性和方法名称,
    • descriptor:目标属性所拥有的特性。

    可供定义的特性列表:

    • value:属性的值
    • writable:如果为false,属性的值就不能被重写。
    • get: 一旦目标属性被访问就会调回此方法,并将此方法的运算结果返回用户。
    • set:一旦目标属性被赋值,就会调回此方法。
    • configurable:如果为false,则任何尝试删除目标属性或修改属性以下特性(writable, configurable, enumerable)的行为将被无效化。
    • enumerable:是否能在for...in循环中遍历出来或在Object.keys中列举出来。
    var lost = {
    loc : "Island"
    };
    Object.defineProperty(lost, "location", {
    get : function () {
      return this.loc;
    },
    set : function (val) {
      this.loc = val;
    }
    });
    不积跬步无以至千里
  • 相关阅读:
    接口限流算法小记
    mac下操作小记
    Java代理(静态代理、JDK动态代理、CGLIB动态代理)
    关系数据库(RDBMS)小记
    Socket端口复用
    SSH使用小记
    HTTP缓存及其使用
    关于浏览器跨域访问(同源策略)
    awk入门教程
    链路追踪工具之Zipkin学习小记
  • 原文地址:https://www.cnblogs.com/lyt0207/p/13043469.html
Copyright © 2011-2022 走看看