使用Proxy模拟PHP的__get魔术函数

来源:互联网 发布:淘宝买高仿手表知乎 编辑:程序博客网 时间:2024/05/29 08:06

在前面我们已经了解了”js中对象的继承”:
http://blog.csdn.net/github_26672553/article/details/54890416
http://blog.csdn.net/github_26672553/article/details/54956265

主要代码如下:

//基类var BaseNews = function bb() {    if (this instanceof bb){        console.log('父类实例化')    }    this.display = function(){        console.log('新闻基类')    };}//给Function进行扩展Function.prototype.extends = function (className) {    className.call(this.prototype); //this 指向实例化过后的对象    //给实例化后的对象的原型上增加一个father对象    //该对象是父类实例化后的对象    //所以 xxx.father就是BaseNews类实例化后的对象    this.prototype.father = new className();}//////////////////////////////////////////////////////////////////////定义SportsNewsvar SportsNews = function () {    //私有属性    var prefix = '[标题前缀]';    var title = '新闻标题';    //有自己的属性    this.version = '1.0';    this.display = function(){        alert('体育新闻');    };    //getter    this.getTitle = ()=>{        return prefix + title;    }    //setter    this.setTitle = (newTitle)=>{        title = newTitle;    }}//扩展SportsNews,实现所谓的继承SportsNews.extends(BaseNews);//实例化var sn = new SportsNews();//sn.father.display(); //弹出:'新闻基类'

今天我们来看看js中如何实现像php中的__get() 魔术函数?

class Test{  function __get($name){    //...  }}$obj = new Test();$obj->myname; //此处被会__get()函数拦截

那么js能实现么?

知识点:es2015的proxy
proxy对象用来为基础操作(属性查找、赋值、枚举、方法调用)定义用户自定义行为。
基本用法:
var target = new xxoo(); //实例化一个你自己的对象
var p = new proxy(target,handler);
然后就是p.xxoo。而不是使用target来调用属性或方法

//实例化var sn = new SportsNews();//sn.father.display(); //弹出:'新闻基类'var proxy = new Proxy(sn,{    get(target,name){ //会被这个拦截        if (name in target){            return target[name];        }else{            return 'none';        }    }})alert(proxy.version); //使用proxy对象访问version属性(其实version属性是sn对象的)

alert(proxy.version); 弹出 “1.0”,
alert(proxy.age); 弹出 “none”。sn对象 没有age 属性。

我们还可以设置不让修改某个属性,对属性修改的拦截:

var proxy = new Proxy(sn,{    get(target,name){ //会被这个拦截        if (name in target){            return target[name];        }else{            return 'none';        }    },    set(target,name,value){        if (name == 'version') {            alert('不要修改version')        }    }})
0 0
原创粉丝点击