面向对象编程
面向对象编程就是将你的需求抽象成一个对象,然后针对这个对象分析其特性(属性)与动作(方法),这个对象我们称之为类;
如何创建类?
1、声明一个函数保存在一个变量里,变量名大写。
2、在函数内部通过对this变量添加属性或者是方法来实现对类添加属性或者是方法;
3,也可以在类的原型(类也是一个对象,所以也有原型prototype)上添加属性和方法。有俩种方式:一、为原型对象属性赋值。二、将一个对象赋值给类的原型对象;
通过this添加的属性和方法同在prototype中添加的方法和属性有什么区别?
通过this添加的属性、方法是在当前对象上添加的,然而javascript是一种基于prototype的语言。所以每创建一个对象时(当然在javascript中函数也是一种对象),他都有一个原型prototype用于指向其继承的属性和方法。这样通过prototype继承的方法并不是对象自身的,所以使用这些方法时,需要通过prototype一级一级查找来得到,这样你就会发现通过this定义的属性或者方法是该对象自身拥有的,所以我们每次通过类创建一个新对象时,this指向的属性和方法都会得到相应的创建,而通过prototype继承的属性和方法是每个对象通过prototype访问到,所以我们每次通过类创建新对象时这些属性和方法不会在次创建。
特权方法?
通过this创建的属性可看做是对象的共有属性和对象的共有方法。而通过this创建的方法,不但可以访问这些对象的共有属性和共有方法。而且还能访问到类(创建时)或者对象自身的私有属性和私有方法。由于这些方法权利比较大。所以我们又将他看成特权方法。
私有属性和方法?
声明在函数内部的方法和变量就是类的私有方法和私有属性。
类外面通过点语法定义的属性和方法被称为类的静态共有属性和类的静态方法。
类的外部通过点语法定义的属性和方法以及在外部通过prototype定义的属性和方法又有什么用呢?
通过new关键字创新对象时,由于类外面通过点语法添加的属性和方法没有执行到,所以新创建的对象中无法获取他们,但是可以通过类来使用,因此在类外面通过点语法 定义的属性以及方法称为类的静态共有属性和类的静态共有方法,而类通过prototype创建的属性或者方法在类实例的对象中是可以通过this访问到的,所以我们将prototype对象中的属性和方法称为共有属性和共有方法;
new 关键字
通过new 关键字创建的对象实质是对新对象this的不断赋值,并将prototype指向类的prototype所指向的对象;
constructor属性?
constructor是一个属性,当创建一个函数或者是对象时都会为其创建一个原型对象prototype,在prototype对象中又会像是函数中创建this一样创建一个constructor属性,那么constructor属性指向的就是拥有这个原型对象的函数或对象;
继承
1、子类的原型对象----类式继承
声明俩个类,第一个类的实例赋值给第二个类的原型,
缺点:
1、由于子类通过其原型prototype对父类实例化继承了父类。所以说父类中的共有的属性要是引用类型,就会在子类中被所有实例公用,因此一个子类的实例更改子类原型从父类构造函数中继承来的共有属性就会直接影响到其他子类。
2、由于子类实现的继承是依靠他的原型prototype对父类的实例化实现的,因此在创建父类的时候,是无法向父类传递参数的,因此在实例化父类的时候也无法对父类构造函数内的属性进行初始化。
2、创建即继承----构造函数继承
通过call或者是apply来实现继承,在子函数中父函数通过call或者是apply更改父函数的this指向。
缺点:
由于这种类型没有涉及到原型prototype,所以父类的原型方法自然不会被子类继承。
3、组合继承
在子类构造函数执行父类构造函数,在子类原型上实例化父类就是组合模式。这样就融合了类继承和构造函数继承的有点,并且过滤了其缺点。
缺点:
构造函数继承时执行了一遍父类的构造函数,在实现子类原型的类式继承时又调用了一遍父类构造函数。
4、洁净的继承者----原型式继承
他是类式继承的一个封装,其中过渡对象就相当于类式继承中的子类,只不过在原型式中作为一个过渡对象出现,目的是为了创建要返回的新的实例化对象。
缺点缺点:
1、由于子类通过其原型prototype对父类实例化继承了父类。所以说父类中的共有的属性要是引用类型,就会在子类中被所有实例公用,因此一个子类的实例更改子类原型从父类构造函数中继承来的共有属性就会直接影响到其他子类。
2、由于子类实现的继承是依靠他的原型prototype对父类的实例化实现的,因此在创建父类的时候,是无法向父类传递参数的,因此在实例化父类的时候也无法对父类构造函数内的属性进行初始化。
5、如虎添翼----寄生式继承
寄生式继承就是对原型式继承的第二次封装,并且在封装过程中对继承对象进行扩展,这样新创建的对象不仅仅有父类中的属性和方法而且还添加新的属性和方法;
它主要是解决在类上扩展一些方法;原型式上是实现了继承但是没有方法扩展一些方法;
6、终极继承者----寄生组合式继承
可被继承的方法和属性无外乎就俩种,一类在构造函数中,这类属性与方法在对象实例化时被复制一遍,另一类在类的原型对象中,这类属性和方法在对象实例化时被所有实例化对象所共用。