JS原型及面对对象总结

1、对象

ECMAScript有两种开发模式:1.函数式(过程化)2.面向对象(OOP)。面向对象的语言有一个标志,那就是类的概念,而通过类可以创建任意多个具有相同属性和方法的对象,而ECMAScript没有类的概念,因此它的对象也与基于类的语言中的对象有所不同。那如何在JS中实现面对对象编程呢?实际上,JS语言是通过一种叫做 原型(prototype的方式来实现面向对象编程的。

  • 创建对象

 在JS里面创建对象有3种方式:

1、子面量

语法:var  对象名={属性,方法};

实例:




    
    创建学生对象




缺陷:它省略了构造函数传参初始化这一过程,带来的缺点就是初始化的值都是一致的,(每个实例对象没有自己的特性)

解决方式:初始化的值都一直每个实例对象没有自己的特性,伪类可以解决问题,
使用组合(构造函数+原型模式)解决传参合共享的问题。

2、调用系统的构造函数创建对象

语法:var 对象名=new Object();

实例:




    
    创建学生对象




缺陷:上面创建了一个对象,并且创建属性和方法,在sayHi()方法里的 this,就是代表 student对象

本身。这种是 JS创建对象最基本的方法,但有个缺点,想创建一个类似的对象,就会产生大量的代码。

解决方式:使用工厂模式的方法,这种方法就是为了解决实例化对象产生大量重复的问题。

解决例子:




    
    工厂方法




3、自定义构造函数方式创建对象:

语法:function 对象名(属性....);

实例:




    
    构造函数




缺陷:每次创建一个Student, 都给我创建了一个sayHi()的实例。 同一个功能的方法,有着多个相同实例

解决方式:原型方法 

2、原型

我们创建的每个函数都有一个 prototype(原型)属性,这个属性是一个对象,它的用途是包含可以由特定类型的所有实例共享的属性和方法。逻辑上可以这么理解:prototype 通过调用构造函数而创建的那个对象的原型对象。使用原型的好处可以让所有对象实例共享它所包含的属性和方法 。也就是说,不必在构造函数中定义对象信息,而是可以直接将这些信息添加到原型中 。

实例:




    
    原型




2.1构造函数的和原型模式的关系如图:

JS原型及面对对象总结_第1张图片


2.2原型-继承

在JS中实现继承利用原型链的关系去实现继承的。每个函数都有一个原型对象,每一个实例对象都有指针指向原型。

原型链: 实例与原型的链条。




    
    原型链




原型链问题 如下实例:




    
    原型链




解决方式:使用借用构造函数继承 如下解决实例:




    
    借用构造函数




图中 call方法可以 把this 替换为 Humans对象 如果Humans对象有参数 也可以 把 Humans对象 参数传递过来,

语法:对象.call(this,参数......);

优点:解决了属性继承,并且值不重复的问题。

缺陷:父级类别中的方法不能继承。

解决方法:组合继承 : 组合继承就是  原型继承+借用继承。

实例:




    
    组合继承












你可能感兴趣的:(JavaScript)