javascript面向对象(三)

时间:2021-10-04 16:19:41
 1 //继承: ECMAScript只支持 实现继承  依靠原型链来实现
2 //一、原型链
3 //先来理清下关系:
4 //每个构造函数都会有一个原型对象 Person --> prototype
5 //每一个原型对象都会有一个指向构造函数的指针 Person.prototype.constructor --> Person
6 //每一个实例都包含一个指向原型对象的内部指针 person1 --> prototype
7 //当原型对象等于另一个类的实例的时候,那么原型对象就会包含一个指向另一个对象的指针,进而也就有了指向另一个构造函数的指针
8 //若干个原型对象层层递进,就会成为一条原型链。
9
10 //对于熟悉OO语言来说,js的继承于传统语言的继承在概念上还是比较通用的
11 //1.它基于原型链上的继承。
12 //以 子类.原型对象 = 父类实例来实现继承关系。 son.prototype = new Father() 来实现
13 //不要与传统语言混肴,传统语言使用 父类指针指向子类对象的方式来声明一个对象
14 //js使用 子类的原型对象指向父类对象的方式实现继承关系
15 //2.子类继承父类之后,就会有了父类的属性于方法。子类属性可以覆盖父类属性,子类方法可以重写父类方法(有待验证)
16 //3.程序在搜索属性字段时,会先从自身实例中搜索,如果搜索不到,在依次按照原型链向上搜索
17 //4.原型链上最顶层时Object对象,所有函数的原型都是Object的实例
18 //5.子类实例调用父类方法与父类实例调用父类方法的结果可能不会相同。子类继承父类的方法与属性之后,可以近似的看作“独立”两个对象
19 //6.使用字面量法创建原型对象会切断掉原型链。
20 //7.原型链问题一、不能向父类构造函数传递参数,因此很少有人单独的使用原型链
21 //8.原型链问题二、上一节提到引用类型的参数不能放在prototype对象中声明,因为该参数会被共享。
22 //但是对于父类声明的引用类型的参数,子类在继承的时候不可避免的在子类的proprtype中继承了该参数,
23 //导致子类的所有实例对象都会共享这一参数。
24 function Father(){
25 this.property = true;
26 }
27 Father.prototype.getFatherValue =function () {
28 return this.property;
29 }
30 function Son() {
31 this.sonproperty = false;
32 }
33 Son.prototype = new Fater(); //继承
34 // Son.prototype = { //使用该形式相当于重写了Son的原型对象,会使得上一句失效,切断了继承关系
35 // getSonValue:function () {
36 // return this.sonproperty;
37 // }
38 // };
39
40 Son.prototype.getSonValue() = function () {
41 return this.sonproperty;
42 }
43 Son.prototype.getFatherValue() = function () {
44 return false; //重写父类的方法,在这里,子类对象调用时返回false,父类对象调用时不受影响仍会返回true
45 }