使用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
- 使用Proxy模拟PHP的__get魔术函数
- 详解php的魔术方法__get()和__set()使用介绍
- Php魔术函数学习与应用 __construct() __destruct() __get()等
- Php魔术函数学习与应用 __construct() __destruct() __get()等 .
- php 魔术方法 __set __get
- php的魔术方法__get()、__set()、__isset()、__unset()的用法
- php魔术方法__set和__get,__isset,__unset的用法
- PHP 魔术方法__set() __get() 方法
- PHP 魔术方法__set() __get() 方法详解
- PHP魔术方法之__set()和__get()
- PHP 魔术方法之"__set()"和"__get"
- PHP 魔术方法__set() __get() 方法
- PHP 魔术方法__set() __get() 方法
- php魔术方法__get和__set详解
- PHP 魔术方法 _set __get __unset __isset
- PHP 魔术方法之__set() __get() 方法
- PHP面向对象:封装--魔术方法__get()
- php的魔术函数和魔术常量
- so库冲突问题解决
- 对象
- 深入浅出JMS(一)--JMS基本概念
- bootstrap table
- 鸡兔同笼
- 使用Proxy模拟PHP的__get魔术函数
- H5项目常见问题及注意事项,视频全屏,定位,屏幕旋转和触摸,偏页面重构向
- 博客迁移
- 在 Windows 系统下安装 IntelliJ IDEA 的方法
- 使用PDO查询mysql防止SQL注入
- RabbitMQ学习总结
- 亚稳态的形成原因
- oracle RAC 更换存储迁移数据(在线迁移ASM磁盘组)测试
- 微博分享的时候是获取网络的图片需要在微博平台进行获取接口调用权限