1. <!DOCTYPE html>
    2. <html lang="en">
    3. <head>
    4. <meta charset="UTF-8">
    5. <meta name="viewport" content="width=device-width, initial-scale=1.0">
    6. <title>实例/原型继承</title>
    7. </head>
    8. <body>
    9. </body>
    10. </html>
    11. <script>
    12. /**
    13. * 优点:
    14. * 简单容易实现,可以直接访问父级原型上的属性的方法;
    15. * 最终实例是 子类实例, 也是父类的实例
    16. * 父类新增的原型的方法子类都能访问
    17. * 缺点:
    18. * 想实现继承必须 new 父级构造函数
    19. * 创建的子类实例 无法向父类传参
    20. * 无法实现多继承
    21. * 来自父级的所有`引用类型`都是共享的
    22. */
    23. function Language() {
    24. this.arr = ['html', 'css'];
    25. this.str = '123'
    26. };
    27. function Css(){
    28. this.css = 'css'
    29. }
    30. // 多继承只能继承最后一个 无法给父级传参
    31. JavaScript.prototype = new Css()
    32. JavaScript.prototype = new Language();
    33. function JavaScript(val) {
    34. this.val = val;
    35. JavaScript.prototype.get = function (val) {
    36. console.log(val); // get fun
    37. console.log(this.val); // this.val
    38. }
    39. }
    40. const js1 = new JavaScript('this.val');
    41. const js2 = new JavaScript();
    42. // 这样直接修改Language上面的属性,会导致在其他实例中的同属性也会被修改掉
    43. // 父级属性·引用类型·共享
    44. console.log(js1.arr); // (2) ["html", "css"]
    45. console.log(js2.arr); // (2) ["html", "css"]
    46. js1.arr.push('JavaScript')
    47. console.log(js1.arr); // (3) ["html", "css", "JavaScript"]
    48. console.log(js2.arr); // (3) ["html", "css", "JavaScript"]
    49. // 基本类型不共享
    50. js1.str = 333;
    51. console.log(js1.str); // 33
    52. console.log(js2.str); // '123'
    53. js1.get('get fun')
    54. // 无法实现多继承 根据上面案例只能继承 Language 无法继承 Css
    55. console.log(js1.css); // 1.1实例继承.html:70 undefined
    56. </script>