zoukankan      html  css  js  c++  java
  • javascript继承的6种方法

     

    1原型式继承

    简介:对类式继承的封装,过渡对象相当于子类。

    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' ] 

    缺点:

    和类式继承一样,父类对象的引用类型值被共用。

    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.寄生组合式继承

    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();  
  • 相关阅读:
    ElasticSearch--------->附录------->curl------->附录一:下载、安装、配置cURL
    ElasticSearch--------------------->step2,了解elasticsearch相关的基本概念
    1. anaconda安装与配置
    js 浮点型数据运算
    2.0 VMware安装教程
    2.2 es6之Promise对象
    代理模式
    oracle原始对象
    锁理论
    策略模式
  • 原文地址:https://www.cnblogs.com/stylesu/p/8528794.html
Copyright © 2011-2022 走看看