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