关于面向对象的简单总结
、什么是对象:万事万物皆对象
一切具有相同本质特征和行为的物质 或一切具有属性和方法的事物,都称作对象。
对象具有两个特性:属性和方法
对象类型 存储在堆中。
例如:
var obj = {
name : "jack"
}
var obj2 = obj ; 将obj的地址传递给obj2
obj2.name = "lily"
alert(obj.name)
什么是面向对象
面向对象是一种编程思想
面向过程和面向对象的区别:
面向过程和面向对象的区别:
面向过程体现的是一种数学逻辑
面向对象体现的是一种生活逻辑
面向对象的优缺点:
优点: 功能独立 便于后期的管理和维护 防止全局变量污染
缺点: 开发周期长 成本高
什么是类(在js中没有类的改变,类就是js中的构造函数)
类是具有相同本质特征和行为的一类事物的总称
类和对象的关系:
类是对象的抽象化(类是对象的抽象) 类是抽象出来的概念
对象是类的具体化(对象是类的具体实例)
先有类还是先有对象?
先有对象 后有累的概念
编程: var arr = new array();
先定义类 ,再从类中创建对象
3、对象的创建方法
字面量的创建方式:
var obj = { }
var obj = new object()
缺点:多个同类对象创建时 代码会重复
2、使用 工厂模式 创建对象 (设计模式之--工厂模式)
优点: 解决多个同类对象创建时代码重复问题
缺点: 对象是通过函数调用的方式创建的 创建对象的方式不规范
不能确定某个对象属于哪一个类(构造函数)
3、使用 构造函数 创建对象
构造函数命名一般是大驼峰格式 ,为了和普通函数进行区分
构造函数中的属性称为实例属性 构造函数中的方法称为实例方法
构造函数中的this 指向 构造函数 new 出来的对象
优点 : 对象使用new 关键字创建的 创建对象的方式规范
能够确定某个对象属于哪一个类 instanceof
缺点 : 多个同类对象的方法会被重复创建 空间不共享
4、 使用 构造函数 创建对象 方法 和属性 都是原创属性 和原型方法
优点 : 使用原型方法 能够解决多个同类对象创建时 空间不共享问题 原型方法空间共享
5、混合 方法 创建对象
属性写在构造函数的内部 作为实例属性
方法写在构造函数的外部 作为原型方法
4、 扩展 使用 object.defineproperty( ) 定义属性 (此内容了解)
语法: object.defineproperty(obj , prop , descriptor )
参数说明:
obj : 必需 。 目标对象
prop : 必需 。 需定义或修改的属性的名字
descriptor : 必需。 目标属性所拥有的特性
例如:
var obj = { }
object.defineproperty(obj,"newkey",{
});
console.log(obj.newkey); // undefined
设置的特性总结:
value :设置属性的值
writable : 值是否可以重写。 true | false false是默认的
enumerable : 目标属性是否可以被枚举。 true | false 如果是枚举对象
可以使用for ...in来遍历
configurable : 目标属性是否可以被删除 true | false
5、原型对象 prototype 也是一个属性(对象),该属性后面可以添加方法
每一个函数都有一个原型对象
每一个构造函数都有一个原型对象
原型对象上的属性和方法能被实例访问
原型对象上的属性和方法不能直接 被子类访问(继承中实现)
javascript 的继承机制基于原理 ,而不是class类
凡是通过new function() 创建的对象都是函数对象,其他的都是普通对象
普通对象没有prototype ,但有_proto_属性
构造函数没有_proto_ 但有prototype 属性
prototype属性(对象)会默认获得一个constructor(构造函数)属性,这个
属性是一个指向prototype属性所在函数的指南针
所有的构造函数都有一个prototype 属性 ,这个属性就称为原型对象
所有的构造函数new出来的对象都有一个 _proto_属性 , 这个属性也对应着一个对象
就是原型对象
6、原型链
实例对象和原型之间的连接 就称为原型链
原型模式的执行流程 :
首先在实例上查找 找到后就返回
继续去 object.prototype 上查找 找到后就返回
面试题:
原型链 作用域链的区别:
原型链是作用在构造函数上 原型链操作的是构造函数的属性 实例属性 原型属性
作用域链是作用在普通函数上 作用域链操作的是全局变量或局部变量
var num = 10;
function fn( num ){
num = 90 ;
}
fn();
alert(num);
7、扩展 原型中的几个关键字
测试某个对象是否属于某个类的方法 isprototypeof( )
语法:构造函数.prototype.isprototypeof(对象):判断一个对象是否指向了该
构造函数的原型对象,可以使用isprototypeof()方法来测试 结果为boolean类型
delete :删除实例属性
语法 : delete 对象.实例属性
hasownproperty( ) 是否包含该实例属性 ,包含返回true ,否则返回false
语法:实例对象.hasownproperty("实例属性")
in 是否存在该属性(原型或实例中)
语法: “属性” in 对象实例
设计模式(了解)
1、什么是设计模式?(以下设计模式内容了解)
设计模式(design pattern) 是一套被反复使用 、多数人知晓的 、 经过分类
编目的 、 代码设计经验的总结。使用设计模式是为了可重用代码,让代码更容易被他人理解,
保证代码可靠性。设计模式就是一种 编程规范 架构层面的
2、设计模式之单例模式(重点掌握一下)
单例:对象只能实例化(创建)一次就叫单例
单例模式:字面量的对象声明{ } ,其实在设计模式中可以看作是一种单例模式,所谓
单例模式,就是永远保持对象的一个实例。
var obj = new object( ) ;
var obj = { } ;
obj = { } 一次只能创建一个对象 - 单例模式
// 实现单例模式
// 实现思路 : 将第一次new出来的对象 this 保存到一个变量中 , 返回这个变量
// 再次创建对象时 , 判断 这个变量中是否含有值,如果有值 ,就直接将这个变量返回
function animal( ) {
//为了防止全局变量的污染 使用私有变量代替 全局变量 ins
//在构造函数的内部 可以通过 构造函数名.变量 创建一个私有变量
if(animal.ins ){
return animal.ins ;
}
animal.ins = this
return animal.ins ;
}
单例模式上的属性可以全局 使用
3、设计模式之代理模式(了解)
代理模式:为其他对象提供一种代理 ,并以控制对这个对象的访问。
function a( ) { 领导
this.dance = function( ){
}
}
function b( ) { 经纪人
this . leader = new a( ) ; 代理模式
this.dance = function( ) {
if( .. ){
this.leader.dance( ) ; //在b中实现a中的功能 这个过程就称作代理
}