Javascript 继承

 1 # 首先你得先知道bind  和  call  的用法
 2 # bind和call都是修改原有对象所属的上下文,也就是this
 3 # 区别是bind之后并不会调用函数,call是直接调用
 4 
 5 # 拓展内置对象
 6 # 内置对象不允许修改原型对象原有属性的,只能新增
 7 # 例:拓展Array内置对象,新增求数组内所有偶数的和
 8 var array = [5,4,3,8];
 9 Array.prototype.getSum = function () {
10   var sum = 0;
11   for (var i = 0; i < this.length; i++) {
12     if (this[i] % 2 === 0) {
13       sum += this[i];
14     }
15   }
16   return sum;
17 }
18 array.getSum();  # 结果是14
19 
20 # 继承
21 # 一、通过对象copy
22 var zs = {
23     name: '张三',
24     money: 10000000,
25     cars: ['玛莎拉蒂', '特斯拉'],
26     hourses: ['别墅', '大别墅'],
27     play: function () {
28         console.log('打高尔夫')
29     }
30 }
31 var zxs = {
32     name: '张小三'
33 }
34 function extend(parent, child) {
35     for (var key in parent) {
36         if (child[key]) {
37             continue;
38         }
39         child[key] = parent[key];
40     }
41 }
42 extend(zs, zxs);
43 
44 # 二、原型继承
45 function Person () {
46     this.name = 'zs';
47     this.age = 18;
48     this.sex = '';
49 }
50 function Student() {
51     this.score = 100;
52 }
53 Student.prototype = new Person();  # 无法配置构造函数参数
54 Student.prototype.constructor = Student;
55 var s1 = new Student()  # 无法配置构造函数参数
56 
57 # 三、借用构造函数
58 function Person (name, age, sex) {
59     this.name = name;
60     this.age = age;
61     this.sex = sex;
62 }
63 Person.prototype.sayHello = function () {
64     console.log(this.name);
65 }
66 function Student(name, age, sex) {
67     Person.call(this, name, age, sex);  # 解决了构造传参问题
68     this.score = 100;
69 }
70 Student.prorotype = Person.prototype;   # 解决了方法继承的问题
71 Student.prototype.constructor = Student;# 但是这个时候改变了Person构造函数的原型对象,这样导致constructor,是如果再有一个新类需要继承Person的话就会出现原型对象冲突问题
72 
73 # 四、解决原型对象冲突问题
74 function Person (name, age, sex) {
75     this.name = name;
76     this.age = age;
77     this.sex = sex;
78 }
79 Person.prototype.sayHello = function () {
80     console.log(this.name);
81 }
82 function Student(name, age, sex) {
83     Person.call(this, name, age, sex);  
84     this.score = 100;
85 }
86 Student.prorotype = new Person();   # 这样子就解决看原型对象冲突的问题了。
87 Student.prototype.constructor = Student; # 再如何修改原型对象都不会影响其他构造函数。

 

posted @ 2022-02-21 16:09  看一百次夜空里的深蓝  阅读(124)  评论(0编辑  收藏  举报