javascript object oriented programming (三)
2011-06-19 12:36 jalen 阅读(248) 评论(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