使用Proxy模拟PHP的

    xiaoxiao2021-03-25  121

    在前面我们已经了解了”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') } } })
    转载请注明原文地址: https://ju.6miu.com/read-23069.html

    最新回复(0)