1、Object对象
1、概念:Array/String/RegExp/Date...对象具有属性和方法,都是预定义好的—js是基于原型的面向对象语言
2、开发方式:
1、面向过程:
开始—>结束,其实我们一致的开发方式都是面向过程:先干什么在干什么然后干什么
2、面向对象:
对象(属性和方法),js有一句话叫做万物皆对象
如:假设一个人是对象:
属性:姓名、性别、年龄、身高、体重...
方法:吃饭、睡觉、跑步、上课、打字...
3、何时使用面向对象:以后任何操作都要封装在一个对象之中—新手不推荐,难度很大
4、为什么面向对象:现实生活中所有的数据都必须包含在一个事物之中才有意义
3、封装/创建/定义
封装自定义对象的3种方式:
1、直接量方式:
<script>
var obj={
"属性名":"属性值",
...,
"方法名":function(){操作},//可以简化为箭头函数
...
}
</script>
强调:
1、其实属性名和方法的 "" 可以不加
2、访问对象的属性和方法:
<script>
obj.属性名;===obj["属性名"];
obj.方法名();===obj["方法名"]();
</script>
建议使用 . 去访问对象的属性和方法,更简单
js中一切都是对象,除了undefined和null,一切对象的底层都是hash数组
3、访问到不存在的属性,返回undefined
4、可以随时随地的添加新的属性和新方法
<script>
obj.属性名=新值;
obj.方法名=function(){};
</script>
5、希望遍历出对象所有的东西,必须使用for in,obj[i]才能拿到,不要使用 . ,会出问题
6、如果希望在对象的方法里使用对象自己的属性,写为this.属性名
1、单个元素绑定事件,this—>这个元素
2、多个元素绑定事件,this—>当前元素
3、定时器中的this—>window
4、箭头函数this—>外部对象
5、函数中this—>谁在调用此方法,this就是谁
6、构造函数之中this—>当前正在创建的对象
2、预定义构造函数方式
<script>
var obj=new Object();//空对象
//需要自己后续添加属性和方法
obj.属性名=新值;
obj.方法名=function(){};
</script>
注意:以上两个都有一个缺陷:一次只能创建一个对象,第一种方法适合创建单个元素,第三种方法适合批量创建元素
3、自定义构造函数方式
1、创建自定义构造函数
<script>
function 类名(name,age,hobby){
this.name=name;
this.age=age;
this.hobby=hobby;
}
//千万不要再里面创建方法,每个对象都会创建出一个相同的方法,浪费内存—继承可以解决
</script>
2、调用构造函数创建对象
<script>
var obj=new 类名(实参,...);
</script>
面向对象优缺点:
优点:
1、所有的属性和方法都保存在一个对象之中—更符合现实更有意义
2、每个功能特地分开写—有利于以后维护
3、铁锁链舟—一个方法触发多个方法联动
缺点:对新手不友好,特别是this的指向问题
2、继承:父对象的成员(属性和方法),子对象可以直接使用
为什么要继承:代码重用!提高代码的复用性,节约内存空间!提升网站性能!
何时继承:只要多个子对象公用的属性和【方法】,都要集中定义在父对象之中
1、如何找原型对象(父对象):保存一类子对象共有属性和共有方法
1、对象名._proto_;
//必须现有一个对象
2、构造函数名.prototype;
//构造函数名几乎人人都有,除了Math和Window,new 构造函数名
();
//Array、String、Date、RegExp、...
2、两链一包:作用域链和【原型链】和闭包
1、每个对象都有一个属性:_proto_,可以一层一层得找到每个人的父亲,形成链式结构,称之为原型链
2、可以找到父对象的成员(属性和方法)
作用:找共有属性和共有方法
3、最顶层的是Object的原型,上面放着一个toString方法,人人都可以使用toString
4、JS万物皆对象
3、有了原型对象可以设置共有属性和共有方法
1、原型对象.属性名=属性值
2、原型对象.方法名=function(){}