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