关于对JavaScript(高级部分)的一些学习心得
一、对象和类型的关系:具体和抽象的关系
二、面向对象与面向过程:
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)可以使用构造函数模式与原型模式结合的方式,让构造函数模式用于定义实例属性,而原型模式用于定义方法和共享的属性