javascript繼承的6種方法

javascript繼承的6種方法

1原型式繼承

簡介:對類式繼承的封裝,過渡對象至關於子類。javascript

 
  1. function inheritObject(o) {  
  2.   //聲明過渡函數對象  
  3.   function F() {}  
  4.   //過渡對象的原型繼承父類  
  5.   F.prototype = o;  
  6.   return new F();  
  7. }  
  8. //測試  
  9. var book = {  
  10.   name : "javascript",  
  11.   book : ['js','css']  
  12. };  
  13. var newbook = inheritObject(book);  
  14. newbook.name = "ajax";  
  15. newbook.book.push("Node");  
  16. var otherbook = inheritObject(book);  
  17. otherbook.name = "xml";  
  18. otherbook.book.push("React");  
  19. console.log(newbook.name);//ajax  
  20. console.log(newbook.book);//[ 'js', 'css', 'Node', 'React' ]  
  21. console.log(otherbook.name);//xml  
  22. console.log(otherbook.book);//[ 'js', 'css', 'Node', 'React' ]  
  23. console.log(book.name);//javascript  
  24. console.log(book.book);//[ 'js', 'css', 'Node', 'React' ] 

缺點:css

和類式繼承同樣,父類對象的引用類型值被共用。html

2.構造函數式繼承

  1. function SuperClass(id) {  
  2.   this.book = ['javascript','html','css'];//引用類型共有屬性  
  3.   this.id = id;//值類型公有屬性  
  4. }  
  5. //父類聲明原型方法  
  6. SuperClass.prototype.showBooks = function() {  
  7.   console.log(this.books);  
  8. }  
  9. //聲明子類  
  10. function SubClass(id) {  
  11.   //繼承父類  
  12.   SuperClass.call(this,id);  
  13. }  
  14. //測試  
  15. var ins1 = new SubClass(1);  
  16. var ins2 = new SubClass(2);  
  17. ins1.book.push("Node");  
  18. console.log(ins1.id);//1  
  19. console.log(ins1.book);//['javascript', 'html', 'css', 'Node']  
  20. console.log(ins2.id);//2  
  21. console.log(ins2.book);//['javascript', 'html', 'css']  
  22.   
  23. ins1.showBooks();//TypeError: ins1.showBooks is not a function  

3.組合式繼承

  1. function SuperClass(name) {  
  2.   this.name = name;  
  3.   this.book = ['javascript','html','css'];  
  4. }  
  5. SuperClass.prototype.getName = function () {  
  6.   console.log(this.name);  
  7. };  
  8. function SubClass(name,time) {  
  9.   //構造函數式繼承,繼承父類name屬性  
  10.   SuperClass.call(this,name);  
  11.   this.time = time;  
  12. }  
  13. //類式繼承,子類原型繼承  
  14. SubClass.prototype = new SuperClass();  
  15. //子類原型方法  
  16. SubClass.prototype.getTime = function () {  
  17.   console.log(this.time);  
  18. };  
  19. //測試  
  20. var ins1 = new SubClass('Node',2016);  
  21. ins1.book.push("Node");  
  22. console.log(ins1.book);  
  23. ins1.getName();  
  24. ins1.getTime();  
  25.   
  26. var ins2 = new SubClass('React',2015);  
  27. console.log(ins2.book);  
  28. ins2.getName();  
  29. ins2.getTime();  

4.原型式繼承

  1. function inheritObject(o) {  
  2.   //聲明過渡函數對象  
  3.   function F() {}  
  4.   //過渡對象的原型繼承父類  
  5.   F.prototype = o;  
  6.   return new F();  
  7. }  
  8. //測試  
  9. var book = {  
  10.   name : "javascript",  
  11.   book : ['js','css']  
  12. };  
  13. var newbook = inheritObject(book);  
  14. newbook.name = "ajax";  
  15. newbook.book.push("Node");  
  16. var otherbook = inheritObject(book);  
  17. otherbook.name = "xml";  
  18. otherbook.book.push("React");  
  19. console.log(newbook.name);//ajax  
  20. console.log(newbook.book);//[ 'js', 'css', 'Node', 'React' ]  
  21. console.log(otherbook.name);//xml  
  22. console.log(otherbook.book);//[ 'js', 'css', 'Node', 'React' ]  
  23. console.log(book.name);//javascript  
  24. console.log(book.book);//[ 'js', 'css', 'Node', 'React' ]  

5.寄生式繼承

  1. function inheritObject(o) {  
  2.   //聲明過渡函數對象  
  3.   function F() {}  
  4.   //過渡對象的原型繼承父類  
  5.   F.prototype = o;  
  6.   return new F();  
  7. }  
  8. //聲明基對象  
  9. var book = {  
  10.   name : "javascript",  
  11.   book : ['js','css']  
  12. };  
  13. function createBook(obj) {  
  14.   //經過原型繼承方式建立新對象  
  15.   var o = new inheritObject(obj);  
  16.   //拓展新對象  
  17.   o.getName = function() {  
  18.     console.log(name);  
  19.   }  
  20.   //返回拓展後的新對象  
  21.   return o;  
  22. }  
  23.   
  24. var newbook = createBook(book);  
  25. newbook.name = "ajax";  
  26. newbook.book.push("Node");  
  27. var otherbook = createBook(book);  
  28. otherbook.name = "xml";  
  29. otherbook.book.push("React");  
  30. console.log(newbook.name);//ajax  
  31. console.log(newbook.book);//[ 'js', 'css', 'Node', 'React' ]  
  32. console.log(otherbook.name);//xml  
  33. console.log(otherbook.book);//[ 'js', 'css', 'Node', 'React' ]  
  34. console.log(book.name);//javascript  
  35. console.log(book.book);//[ 'js', 'css', 'Node', 'React' ]  

6.寄生組合式繼承java

  1. function inheritObject(o) {  
  2.   //聲明過渡函數對象  
  3.   function F() {}  
  4.   //過渡對象的原型繼承父類  
  5.   F.prototype = o;  
  6.   return new F();  
  7. }  
  8. //寄生式繼承 繼承原型  
  9. function inheritPrototype(subClass,superClass) {  
  10.   //複製一份父類的原型副本保存在變量中  
  11.   var p = inheritObject(superClass.prototype);  
  12.   //修正由於重寫子類原型致使子類的constructor屬性被修改  
  13.   p.constructor = subClass;  
  14.   //設置子類的原型  
  15.   subClass.prototype = p;  
  16. }  
  17. function SuperClass(name) {  
  18.   this.name = name;  
  19.   this.colors = ["red","blue","green"];  
  20. }  
  21. //定義父類原型方法  
  22. SuperClass.prototype.getName = function() {  
  23.   console.log(this.name);  
  24. }  
  25. function SubClass(name,time) {  
  26.   SuperClass.call(this,name);  
  27.   this.time = time;  
  28. }  
  29. //寄生式繼承父類原型  
  30. inheritPrototype(SubClass,SuperClass);  
  31. //子類新增原型方法  
  32. SubClass.prototype.getTime = function() {  
  33.   console.log(this.time);  
  34. }  
  35. //測試  
  36. var ins1 = new SubClass("js",2014);  
  37. var ins2 = new SubClass("css",2015);  
  38. ins1.colors.push("black");  
  39. console.log(ins1.colors);  
  40. console.log(ins2.colors);  
  41. ins2.getName();  
  42. ins2.getTime();  
相關文章
相關標籤/搜索