面向对象

来源:互联网 发布:手机网络延迟高怎么办 编辑:程序博客网 时间:2024/06/07 03:00

1.什么是面向对象?

a,万物皆对象;

b,而同一种对象也是一个类;

c,面向对象区别于面向过程,抓住问题核心,只考虑功能和结果,而不考虑过程和内部的实行;

d,是由属性和方法组成;

e,具有抽象,封装,继承,多态的特征;

f,比如一个人是一个对象,一个机器是一个对象,一本书也是一个对象;

g,面向对象可以把程序中的关键模块都视为对象,而模块拥有属性及方法。这样我们如果把一些属性及方法封装起来,日后使用将非常方便,也可以避免繁琐重复的工作.

h,会使用对象的方法和属性,不关注内部细节,也会构造对象

2.什么是抽象?

a,把同类的对象共有的属性或方法抽出封装成单独的对象,在用到的时候给相应的对象使用;

3.什么是封装?

a,只考虑功能和使用,不考虑内部的细节;比如;jq库的使用;

b,隐藏对象的属性和细节,仅对外公开接口,防止使用者对内部资料的破坏;

4.什么是继承?

a,一个对象使用另一个对象的属性和方法;

b,js继承必须基于对象来继承;

c,有两种继承方式:1,对象冒充,优点是可以实现多重继承,初始化 继承自父类的参数;缺点是浪费内存资源,所有的实例都会有一份成员方法的副本;2.原型方式,

5.什么是多态?

a,同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果。

b,引用类型在不同情况下的多种状态;

c,比如“+”,在字符串中是链接符号,在数字间是加号;

d,有3中最常见的方式:—1.重载(重载是指多个同名但参数不同的方法,这个JavaScript确实没有,但是我们可以绕个大弯来实现,根据arguments来判断参数个数和类型,然后再函数体中分情况执行不同的代码。)—2.重写(重写指子类重新定义父类方法,这正好就是基于prototype继承的玩法);—3.接口;

6.构造函数存在问题?

a,没有new,类名没有大写;

b,看似代码被封装,但其实调用的是另一个代码块,浪费内存;

7.this详解

a,this指的是,调用函数的那个对象。

b,代表函数运行时,自动生成的一个内部对象,只能在函数内部使用

分四种情况详解this
1.情况一:纯粹的函数调用
这是函数的最通常用法,属于全局性调用,因此this就代表全局对象Global

请看下面这段代码,它的运行结果是1。  function test(){     this.x = 1;     alert(this.x);   }   test(); // 1 
为了证明this就是全局对象,我对代码做一些改变,但结果还是1 var x = 1;   function test(){     alert(this.x);   }   test(); // 1 

情况二:作为对象方法的调用
函数还可以作为某个对象的方法调用,这时this就指这个上级对象。

function test(){     alert(this.x);   }   var o = {};   o.x = 1;   o.m = test;   o.m(); // 1 

情况三 作为构造函数调用
所谓构造函数,就是通过这个函数生成一个新对象(object)。这时,this就指这个新对象。

运行结果为1。为了表明这时this不是全局对象,我对代码做一些改变: function test(){     this.x = 1;   }   var o = new test();   alert(o.x); // 1 
运行结果为2,表明全局变量x的值根本没变。 var x = 2;   function test(){     this.x = 1;   }   var o = new test();   alert(x); //2

情况四 apply调用
apply()是函数对象的一个方法,它的作用是改变函数的调用对象,它的第一个参数就表示改变后的调用这个函数的对象。因此,this指的就是这第一个参数。

apply()的参数为空时,默认调用全局对象。因此,这时的运行结果为0,证明this指的是全局对象。var x = 0;   function test(){     alert(this.x);   }   var o={};   o.x = 1;   o.m = test;   o.m.apply(); //0 
如果把最后一行代码修改为 o.m.apply(o); //1运行结果就变成了1,证明了这时this代表的是对象o

8.什么是工厂模式?

a,就是在函数内创建一个对象,给对象赋予属性及方法再将对象返回即可。

b,解决了创建多个相似对象的问题

c,缺点:工厂模式却不能识别对象的类型,因为全部都是Object,不像Date、Array等,因此出现了构造函数模式。

9.什么是构造函数?

a,可以创建特定类型的对象,类似于Array、Date等原生JS的对象,

b,使用构造函数的最大的问题在于每次创建实例的时候都要重新创建一次方法(理论上每次创建对象的时候对象的属性均不同,而对象的方法是相同的),然而创建两次完全相同的方法是没有必要的,因此,我们可以将函数移到对象外面。

c,就是构造对象的函数。

10.构造函数区别于工厂模式是那些点?

a,函数名首写字母为大写

b,没有显示的创建对象

c,直接将属性和方法赋值给了this对象

d,没有return语句

e,使用new创建对象

f,能够识别对象(这正是构造函数模式胜于工厂模式的地方)

11.什么是原型?

a,我们创建的每个函数都有prototype(原型)属性,这个属性是一个指针,指向一个对象,而这个对象的用途是包含可以由特定类型的所有实例共享的属性和方法。使用原型对象的好处就是可以让所有对象实例共享它所包含的属性及方法。

b,原型可以用来构造属性和方法,让属性和方法变成公用的代码;内存当做节约资源,提供系统性能;

c,缺点:1.省略了构造函数传递初始化参数这一环节,结果所有实例在默认情况下都取得了相同的属性值。2.由于共享,一个实例修改了引用,另一个也会随之更改;

解决办法:混合模式(原型模式 + 构造函数模式)

12.混合模式的好处?

a,混合模式中构造函数模式用于定义实例属性,而原型模式用于定义方法和共享属性。每个实例都会有自己的一份实例属性,但同时又共享着方法,最大限度的节省了内存。另外这种模式还支持传递初始参数。优点甚多。这种模式在ECMAScript中是使用最广泛、认同度最高的一种创建自定义对象的方法.

13.什么是原型链?

理解一:在js中,把值分为两类,原始值和对象值,每个对象又有一个内部属性原型(protetype),原型的值可以是一个对象,也可以是null,当他是对象时,那对象又有一个内部原型,这个过程就形成了一个线性的原型链。

理解二:在js中,一个对象所拥有的属性不仅仅是它本身拥有的属性,它还会从其他对象中继承一些属性。当js在一个对象中找不到需要的属性时,它会到这个对象的父对象上去找,以此类推,这就构成了对象的原型链。

理解三:原型链是针对构造函数的,比如我先创建了一个函数,然后通过一个变量new了这个函数,那么这个被new出来的函数就会继承创建出来的那个函数的属性,然后如果我访问new出来的这个函数的某个属性,但是我并没有在这个new出来的函数中定义这个变量,那么它就会往上(向创建出它的函数中)查找,这个查找的过程就叫做原型链。

原型链最终指向了null。

理解四:实例对象和原型直接的链接叫原型链。

比如css样式中,子元素会继承父元素的宽;

14.闭包是什么?

a,子函数使用父函数的局部变量。

15.什么是组件开发?

a,将 参数,方法,事件(自定义事件) 三者分离