面向对象简介
面向对象
概述
- 简单的概述以下面向对象
面向对象变成的全称为object oriented programming, 简称oop。 面向对象编程时用抽象的方式创建基于现实世界模型的一种编程模式。
面向对象编程可以看作时使用一系列对象相互协作的软件设计。面向对象编程设计的目的时在编程中促进更好的灵活性和可维护性。凭借其对模块化的重视,面向对象的代码开发更简单,更容易理解。面向对象编程的三个重要特征:( 1 封装,2 继承,3 多态)。
所有的程序是由一定的属性和行为对象组成的,不同的对象的访问通过函数调用来完成,对详间所有的交流都是通过方法调用,通过对封装对象数据,提高复用率。
- 向对象是什么
JavaScript是一种基于原型的面向对象语言,而不是基于类的。正是由于这一种根本的区别,其如何创建对象的层级结构以及对象的属性与属性值是如何继承的并不是那么清晰。
基于原型的语言(如JavaScript) 并不是在这种区别:它只有对象。基于原型的语言具有所谓原型对象(prototypcal object) 的概念。原型对象可以作为一个模板,新对象可以从中获取原始的属性。任何对象都可以指定其自身的属性,既可以是创建时也可以在运行创建时。而且任何对象都可以作为另一个对象的原型(prototype),从而允许后者共享前者的属性。
- 封装
所谓封装就是按照要求使用并得到对应的结果,而不需要知道其真实的执行原理是怎么样的
封装主要用于阐述对象所包含的内容,他们通常由两个部分组成:
1相关的数据(用于存储属性) 2基于这些数据所能作的事情
- 继承
继承通常是指类与类之间的关系。如果两个类都具有相同的属性或方法,那么可以让一个继承于另一个类,这样就不需要在前者再次定义同样的属性或方法。
创建一个或者多个类的专门版本类方式为继承。创建的专本版本的类通常叫做子类,另外的类通常叫做父类。在JavaScript中,继承通过赋予子类一个父类的实例并专门化子类来实现
- 多态
不同的对象可以定义具有相同名称的方法,方法是作用于所在的对象中。这种不同对象通过相同方法的调用实现各自行为的能力,被称之为多态。
构造函数
- 构造函数
构造函数由称之为构造器或对象模板,是对象中的一个方法,在实例化是构造器被调用。在JavaScript中函数就可以作为构造器使用,因此不需要特别的定义一个构造器方法。
function person(){ console。log(‘person instantiated’);
}
var person = new person ();
这里的person()并不是作为函数 而是构造函数。
创建person对象需要使用new关键自
- 构造函数的实行
构造函数的属性实际上就是对象的变量。一个对象可以包阔多个属性,定义构造函数属性是使用this这是关键字。
function Person (firstname){
this.firstname =firstName;
console.log (‘person instanttiated’);
}
var person = new person (‘Alice’);
console。log (‘person is +person。firstname’);
- 构造函数的方法
构造函数的方法想构造函数的属性,不同的是方法是以恶函数(或像函数一个样被定义)。定义构造函数的方法时使用this关键词。
var person = function(firstname){
this.firstname = firstName;
this.sayhello = function () {
console.log ('hello, I'm+this.firstName');
};
};
var person = new person (Alice);
person.sayhello();
- this这个关键词
JavaScript 有一套完全不同于其他语言的对this处理机制,this 关键字本身没有任何含义,比如下记中不同的情况下,this指向的各种不同。
全局范围内:this关键字会指向全局对象。
this。a = 10 //global。a=10
console.log(a);//10
构造函数内:this 关键字会指向新创建的对象。
构造函数的方法内:this关键字会指向当前对象。
var hero={};
hero.sayName = function (){
return 'hello ' +this.name;
}
Object类型
- 属性描述符
JavaScript提供里一个内部数据结构,用于描述对象的值,控制其行为,例如该属性是否可写,是否可配置,是否修改以及是否可枚举等。这个数据结构被称为'属性描述符'。
每一个属性都有自己对应的属性描述符,保存属性的元信息。
{
value :‘卧龙学院’,
writable:false,
enumerable:true,
configurable:false,
get:undefined,
set:undefind
}
对象里面目前存在的属性描述符有两种主要形式:数据描述符和存储描述符。
- 数据描述符
数据描述符是一个具有值得属性,该值可能是可写的,也可能不是可写的。该数据描述符具有以下可选建值:
value:该属性对应的值。可以是任何有效的JavaScript值(数值 对象,函数等。默认为undefined)
writable:当且仅当该属性的writable 为true时,value才能被赋值运算符改变。默认为false。
configurable:当且仅当该属性的configurable为true时,该属性描述符才能够被改变,同时该属性也能从对应的对向上被删除。默认为false。
enumerable:当且仅当该属性的enumerable为true时,该属性才能够出现在对向上的枚举属性中默认为false
- 存储描述符
存取描述符时由getter-setter 函数对描述的属性。存取描述符具有以下可选建值:
get:给属性提供getter方法,如果没有getter则为undefined。当访问该属性时,该方法会被执行,方法执行时没有参数传入,但是会传入this对象。
set:给属性提供setter的方法,如果没有setter则为undefined。当属性值修改时,触发执行该方法。该方法将接受唯一参数,及该属性新的参数值。
configurable:当且仅当该属性的writable 为true时 ,该属性描述符才能够被该表,同时属性也能从对应的对象上被删除。默认为false。
enumerable:当且仅当该属性的enumerable为true时,该属性才能够出现在对象的枚举属性中。
默认为false
- 获取属性描述符
ObjectgetowmpropretyDescriptor()方法返回指定对象上一个自由属性对应的属性描述符。
obj:需要查找的目标对像,
prop:目标对象内属性名称(string类型)。
返回值:如果指定的属性存在于对向上,则返回其属性描述符对象,否则返回undefined。
- 设置属性描述符
objectdefineproperty()方法为对象定义属性改变现有属性,并返回该对象。
obj:要在其上顶会议属性的对象。
prop:要定义或者修改的属性名称。
descriptor:将被定义或修改的属性描述符。
返回值:被传递给函数的对象。
objectdefineproperties()方法为对象定义一个或者多个新属性或修改现有属性,并返回该对象。
obj:要在其上定义属性的对象。
props:要定义其可枚举属性或修改的修改属性描述符的对象。
返回值:被传递给函数的对象。
- 属性描述符的可选建值
writable:Boolean值,表示目标属性的值是否可以内修改。当且仅当该属性的writable为true时,value才能被赋值元算符该表。默认为false。
- 属性描述符的可选键值
configurable:Boolean值,表示目标属性的描述符是否可以被修改。当且仅当该属性的configurable为true时,该属性描述符才能够被该表,同时该属性也能从对应的对向上被删除。默认为false
- enumerable:Boolean值,表示目标属性是否可遍历。当且仅当该属性的enumerable为true时,
该属性才能够被出现在对象的枚举属性中。默认为false。
如果对象的属性的enumerable的值为false,以下三种操作取不到的属性:
for in
objectkey()方法
jsonstring()方法
- 属性描述符的存储器
对象的属性除了可以直接定义以外,还可以使用存储器进行定义。其中setter为存储函数,使用属性描述符中的set;getter为取值函数,使用属性喵符中的get
- 防篡改
定义的对象默认在任何时候,任何位置,无论有意义的还是无意义的都可以修改对象的属性或方法。而这些篡改可能会影响内置属性或方法,从而导致对象的正常功能可能无法使用。
JavaScript在ecmascrip5版本中新增字放置篡改对象的属性或方法的机制,共提供了以下三级保护方式:
禁止拓展:禁止为对象扩展新的属性或方法
密封对象:禁止扩展新的属性或方法,禁止配置现有的属性或方法描述符,仅允许读写属性的值。
冻结对象:禁止对对象执行任何修改操作。