javascript object oriented programming (三)
2011-06-19 12:36 jalen 阅读(249) 评论(0) 收藏 举报/*
*非构造函数,那就是只要不是构造函数的
* 两个对象都是普通对象,不是构造函数,无法使用构造函数方法实现"继承"。
* json格式的发明人Douglas Crockford,提出了一个object()函数,可以做到这一点。
*/
var chinese = {
nation:"中国"
}
var Doctor = {
career:'医生'
}
//
function object(o){
//创建一个空的构造函数F,F的prototype是o(父对象,或者叫要被继承的对象)对象的引用,
//也就是说F.prototype指向需要继承的对象
function F(){}
F.prototype = o;
//返回F构造函数的实例化对象,这样F的实例化对象就有个对父对象的引用了。
return new F();
}
var Doctor = object(chinese);
Doctor.career = '医生'; //然后,再加上子对象本身的属性: 这步不需要也能继承到!
console.log(Doctor.nation) // 中国 子对象已经继承了父对象的属性了。
/*
* 三、浅拷贝 (拷贝基本类型的数据)这是早期jQuery实现继承的方式。
* 除了使用"prototype链"以外,还有另一种思路:把父对象的属性,全部拷贝给子对象,也能实现继承。
*/
var chinese = {
nation:"中国",
birthPlaces :['北京','上海','香港']
}
var Doctor = {
career:'医生'
}
function extendCopy(p){
var c = {} //创建一个空对象,用于存储要拷贝的属性
for(var i in p){
c[i] = p[i];
}
c.uber = p; //子对象的一个属性对父对象的引用,备用属性~
return c;
}
var Doctor = extendCopy(chinese);
//如果修改了Doctor.birthPlaces 的属性值,chinese.birthPlaces也会受到影响
Doctor.birthPlaces.push('厦门');
console.log(Doctor.nation);
console.log(Doctor.birthPlaces);
console.log(chinese.birthPlaces);
/*
* 四、深拷贝 目前,jQuery库使用的就是这种继承方法。
* 所谓"深拷贝",就是能够实现真正意义上的数组和对象的拷贝。它的实现并不难,只要递归调用"浅拷贝"就行了。
*/
var chinese = {
nation:"中国",
birthPlaces :['北京','上海','香港']
}
var Doctor = {
career:'医生'
}
function deepCopy(p,c){
var c = c || {};
for(var i in p){
if(typeof p[i] ==='object'){
c[i] = (p[i].constructor === Array) ? [] :{};
deepCopy(p[i],c[i]);
}else{
c[i] = p[i];
}
}
return c;
}
var Doctor = deepCopy(chinese);
//现在,给父对象加一个属性,值为数组。然后,在子对象上修改这个属性:
Doctor.birthPlaces.push('厦门');
console.log(Doctor.nation);
console.log(Doctor.birthPlaces); //["北京", "上海", "香港", "厦门"]
//这时,父对象就不会受到影响了。
console.log(chinese.birthPlaces); //["北京", "上海", "香港"]
非构造函数的继承
学习笔记,记录学习过程的地方。
原文链接:http://www.ruanyifeng.com/blog/2010/05/object-oriented_javascript_inheritance_continued.html
浙公网安备 33010602011771号