1.面向对象的基本概念
1.1 是不是一个面向对象的语言
不是:与传统的面向对象的理论有矛盾。(C# ,java)
是:js 里面到处都是对象。 数组 时间 正则 ...
给出一个折中的说法
js是一个基于对象的多范式编程
多范式:是指编程风格
1.面向过程的方式编程
2.面向对象的方式编程
3.函数式编程...
** -> 函数式编程的一个特点:递归与链式**
jQuery 就是典型的链式编程风格
比如:给div标签添加样式
$('div').css('border','1px solid red');
1.2面向对象的概念
概念:要做什么就找到对应的对象,告诉他做什么,然后等待结果。
面向对象是面向过程的封装。
1.3万物皆对象
在实际开发中,对象是一个抽象的概念,可以将其简单的理解为:数据集或者功能集、
—>数据集:很多数据打包到一起。{name:'张三',age:19,gender:'男'}
假设展示10条商品数据:每个商品:名字,描述,价格,图片
—>每一条数据可以变成一个对象:{name:'',desc:'',price:0,img:''}
—> 引入数组,将数据存储到数组中。
—>功能集:
1.4 面向对象的特性
1.抽象性(抽取一些我们需要的属性和方法)
2.封装性
3.继承性
4.多态性(在js中,不需要多态性)
2.js的数据类型
2.1分类:
1.基本数据类型(值类型):number string ,boolean
2.复合数据类型(引用数据类型):时间,数组,正则
3.空类型
基本数据类型的存储模型 就是一个方格里面放一个数据
复合数据类型的存储模型 是一个单独的内存的区域,对象有什么
属性,那么内存区域中就有什么属性。变量只存储对象的'地址',所以
它不是真正存储数据的区域。
注意: 复合类型除了funcion以外,无法通过typeof 获取
到数据类型。需要通过Object.prototype.toString.apply()
获取到它是什么数据类型。
2.2值类型和引用类型的存储特征
-->值类型的数据,只需要开辟一段内存存储数据即可。
-->对象类型(引用类型), 对象才是真正的数据,需要占据单独的内存。
而变量名只是存储着对象的内存地址(引用)。
2.3值类型与引用类型的赋值与传参的特点
--> 赋值:将原变量中的数据拷贝一份,然后存储到给定变量中
值类型:拷贝的数据与原来没有关系,改变一个变量,另一个变量不会随着改变。
引用类型:由于引用类型存储的是地址,因此改变一个值,另一个值也会改变。且值与
与改变的相同。
2.4函数参数传递
函数要调用时,需要传参数。
在调用函数时,形参会先复制一份实参。
3. 深拷贝与浅拷贝
3.1什么是拷贝
就是创建一个与目标数据一模一样的数据。
3.2拷贝
var p={
name:'张三',
age:19.
gender:'男',
clone:function(){
var temp={};
temp.name=this.name;
temp.age=this.age;
temp.gender=this.gender;
temp.clone=this.clone;
return temp
}
var p2=p.clone();
}
3.2 深拷贝与浅拷贝
//浅拷贝案例
var car={name:'保时捷'};
var person={
name:'张三',
age:19.
gender:'男',
clone:function(){
var temp={};
temp.name=this.name;
temp.age=this.age;
temp.gender=this.gender;
temp.clone=this.clone;
return temp
}
var p1=person.clone();
var p2=person.clone();
//p1中的car与p2中的car是同一个对象,这属于浅拷贝
//深拷贝
function deepCopy(p, c) {
var c = c || {};
for (var i in p) {
if (typeof p[i] === 'object') {
c[i] = (p[i].constructor === Array) ? [] : {};
deepCopy(p[i], c[i]);
} else {
c[i] = p[i];
}
}
return c;
}
}
如果对象的属性也是引用类型,拷贝的时候不重新创建一个新的
对象来实现该属性的拷贝,那么就是浅拷贝。既是浅拷贝。
讲两个对象完全从内存中隔离开,就是深拷贝,既每一个引用
属性,以及引用属性的引用,全部拷贝出来,就是深拷贝。
4.构造函数(构造器 controctor)作用
—>4.1js中对象的动态特性
即 想要什么属性就可以提供什么属性
在js 中 对象如果没有指定的属性,只需要利用赋值就可以
给对象提供属性。
—>点语法与关联数组的语法
o.name='jim'; //点语法赋值
o['name']='tom';关联数组语法赋值
问题:
//name是一个变量,里面存储的是字符串,也是可以的
o[name]='jack';
4.2使用工厂方法创建函数
function createPerson( name, age, gender ) {
var p = {};
p.name = name;
p.age = age;
p.gender = gender;
return p;
}
var p1 = createPerson( 'jim', 19, '男' );
var p2 = createPerson( 'lily', 18, '女' );
这个( 这种类型 )的函数就是用来创建对象的, 即生产对象. 常常将这类函数
称为 '工厂函数'
4.3构造函数常见函数
function Person( name, age, gender ) {
this.name = name;
this.age = age;
this.gender = gender;
}
// 调用构造器创建对象
var p = new Person( '李磊', 19, '男' );