一,对象和类型的关系:具体和抽象的关系
二,面向对象与面向过程:
1,1)区别: 面向对象(OO)侧重于具体的功能, 注重的是整体和最后的结果;
面向过程 (OP) 则是一种以事件为中心的编程思想,是侧重编程的过程,注重问题的解决部分.
2)联系: 面向对象是将事物高度抽象化.面向过程是一种自顶向下的编程, 面向对象必须先建立抽象模型,之后直接使用模型.通过面向过程来设计实现方法, 最后实现面向对象.
2,各自的优缺点:
1)面向对象的优点:结构清晰,程序便于模块化,结构化,抽象化,更加符合人类的思维方式; 封装性,将事务高度抽象,便于流程中的行为分析,也便于操作; 易扩展,代码重用率高,可继承,可覆盖; 实现简单,可有效地减少程序的维护工作量,软件开发效率高.
2) 面向对象的 缺点是:面向对象在面向过程的基础上高度抽象,从而和代码底层的直接交互非常少机会, 从而不适合底层开发和游戏甚至多媒体开发;对于事务开发而言,事务本身是面向过程的,过度的封装导致事务本身的复杂性提高.
3)面向过程的优点: 流程化使得编程任务明确;效率高, 面向过程强调代码的短小精悍;流程明确,具体步骤清楚,便于节点分析.
4)面向过程的缺点:需深入思考,耗费精力,代码重用性低,扩展能力差,维护难度大, 对复杂业务来说,面向过程的模块难度较高,耦合度也较高.
三,面向对象的三大基本特征:
1,封装:把客观事物封装成抽象类或具体的对象,并且类或对象可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏.
2,继承:某个类型的对象获得另一个类型的对象的属性和方法
3,多态:不同实例的相同方法在不同情形有不同表现形式.
四,创建对象的几种方式:
1,使用对象字面量创建对象:
var person = {
name: "李四",
age: 20,
sex: "男"
};
console.log(person.name);
1) 语法格式:{属性名: 属性值, ......, 方法名: 函数,....}
2) 对象字面量是对象定义的一种简写形式,目的在于简化创建包含大量属性的对象的过程.但也存在很大的缺陷就是会很容易产生大量的重复代码, 效率不高.
2,使用工厂模式创建对象
function createPerson(name,age) {
return {
name:name,
age:age,
speak:function () {
console.log("正在说话...");
}
}
var p= createPerson("Nike",29);
1) 在使用工厂模式创建对象的时候,我们都可以注意到,在 createPerson 函数中,return 返回的是一个对象,那么我们就无法判断返回的对象究竟是一个什么样的类型,因此可以利用构造函数创建对象解决这个问题.
3,使用构造函数创建对象
function Person(name, age){
this.age = age;
this.name = name;
this.speak = function (){
console.log(this.name);
}
}
var p= Person("李四",20);
1)构造函数: 替代其他语言中的 class
2)构造函数的命名一般遵循大驼峰: 所有单词的首字母大写
3)对比工厂模式,我们可以发现以下区别:
a. 没有显示地创建对象; b. 直接将属性和方法赋给了 this 对象; c. 没有 return 语句; d. 可识别对象类型.对于检测对象类型,我们可以使用 instanceof 操作符检测, 返回的是 true 或者 false
4) 缺点: 方法是每个对象都会有一份, 导致资源的浪费.
优点: 数据属性, 每个对象都会有一份
4,原型创建对象模式
function Person(){}
Person.prototype.name ="李四";
Person.prototype.age = 20;
Person.prototype.sayName = function(){
alert(this.name);
};
var p1 = new Person();
p1.sayName();
1) 使用原型创建对象的方式,可以让所有对象实例共享它所包含的属性和方法.
2) 缺点: 数据属性共享.
优点: 方法共享
3) 原型创建对象模式正好是与构造函数互补的, 因此可以通过组合使用构造函数模式和原型模式达到最优化
5,组合使用构造函数模式和原型模式
function Person(name,age){
this.name =name;
this.age = age;
this.job = job;
}
Person.prototype = {
constructor:Person,
sayName: function(){
alert(this.name);
};
}
var p1 = new Person("李四",20);
1)可以使用构造函数模式与原型模式结合的方式,让构造函数模式用于定义实例属性,而原型模式用于定义方法和共享的属性
来源: http://www.qdfuns.com/notes/48922/2d0c2b8e373486921aa4fbc19b10bf07.html