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

在前面我们已经了解了”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();
}



//定义SportsNews
var 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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值