(动手)拦截getter,setter

news/2024/6/18 19:18:15

前言

首先出道面试上机题简化版(来自喜马拉雅Fm),侵删。

        ****
        你需要在这里完成People的构造函数
        ****
        //从而会按照期望执行下面的代码
        var man = new People("小明");
        var women = new People("小红")
        console.log(man.name)      // 期望为       小明
        man.name = "小刚"          // 期望为        warn:不允许通过赋值运算符
        console.log(man.name)     // 期望为       小明
        console.log(women.name)   // 期望为       小红
        women.setName("小黄")
        console.log(women.name)   // 期望为       小黄

clipboard.png

我的方案

Object.defineProperty

 var People = function (name){
            this._name = name;
            Object.defineProperty(this,"name",{
                get:function(){
                    return this._name
                },
                set:function(name){
                    console.warn('不允许通过赋值运算符')
                }
            })
            this.setName = function(name){
                this._name = name;
            }
        }

Proxy

var createPeople = function(name){
            var obj = new Object();
            obj._name = name;
            obj.setName =  function(name){
                this._name = name;
            }
            return obj
        }
        var People = function (name){
            return new Proxy(createPeople(name), {
            get: function (target, key, receiver) {
                if(key === 'name'){
                    return target['_name']
                }
                return target[key];
            },
            set:function(target,key,value,receiver){
                if(key === '_name'){
                    target._name = value
                    return 
                }
                console.warn('不允许通过赋值运算符')
            }
        });
        }

Class

class People{
             constructor(name){
                 this._name = name;
             }
             get name(){
                 return this._name;
             }
             set name(name){
                console.warn('不允许通过赋值运算符')
             }
             setName(name){
                 this._name = name;
             }
        }

小结

我把自己的代码放出来,抛砖引玉,也希望大家可以 review我的代码,指出不足之处和可优化之处。

http://www.niftyadmin.cn/n/1978426.html

相关文章

骚操作之第五十一话主从复制、哨兵、集群

文章目录一、RDB和AOF1、RDB2、AOF3、RDB和AOF的对比二、redis集群模式1、主从复制2、哨兵3、集群三、redis主从复制四。哨兵模式五、CLUSTER集群一、RDB和AOF 1、RDB 内存数据包保存到磁盘中实现持久化(中间会进行压缩) 1.1、持久化的方式:基于结果,有…

C# 反射技术应用

反射(Reflection)是.NET中的重要机制,通过放射,可以在运行时获得.NET中每一个类型(包括类、结构、委托、接口和枚举等)的成员,包括方法、属性、事件,以及构造函数等。还可以获得每个…

设计模式--建造者模式(builder)

建造者模式概述将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。 适用性 1.当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时。2.当构造过程必须允许被构造的对象有不同的表示时。 参与者 1.Builder为创建一个Produ…

骚操作之rsync下行同步+lnotify实时同步详解

文章目录一、rsync同步加简介1、关于rsync2、rsync同步源(备份源)二、配置rsync备份源三、Rsync命令基本用法1、基本格式2、常用选项四、配置发起端(backuper)五、配置RsyncInotify实时同步一、rsync同步加简介 1、关于rsync rsync(Remote Sync,远程同步…

超几何分布和二项分布【中阶高阶辅导】

前言 二项分布与超几何分布是两个非常重要的、应用广泛的概率模型,实际中的许多问题都可以利用这两个概率模型来解决.在实际应用中,理解并区分两个概率模型是至关重要的.下面举例进行对比辨析. 一、概念辨析 超几何分布…

Cisco *** 完全配置指南-连载-详解路由器的站点到站点IPSec ***连接问题(1)

Cisco *** 完全配置指南-连载-详解路由器的站点到站点IPSec ***连接问题(1)详细内容见附件

骚操作之ELK日志分析系统

文章目录前言一、ELK日志分析系统简介1、日志处理的步骤2、ELK日志分析系统三部分3、日志服务器二、Elasticsearch介绍1、Elasticsearch概述2、Elasticsearch的概念3、采用分片4、开启分片副本的主要原因三、Logstash介绍1、Logstash概述2、Logstash主要组件四、Kibana介绍1、K…

nginx+lua(openresty) lua-mongodb 安装及使用(四)

前言 前章已经讲述 ua-protobuf 安装及使用 这章主要讲述 openresty 环境下 lua-mongodb 安装及使用 1:环境 ubuntu16(18) mongodb 3.6 2:安装mongodb 3.6 sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 2930ADAE8CAF5059EE73BB4B58712A2291FA4AD5 #创…