概念
为什么要有对象?
如果有一组相关的数据,松散的储存不利于使用,存入数组中受下标限制有必须有固定的顺序,而对象可以自定义名称存储一系列无序的相关数据。
什么是对象?
现实生活中的对象:万物皆对象,对象是一个具体的事物,一个具体的事物就会有行为和特征。
举例:一部车
车市一类事物,门口停的那辆车才是对象
特征:红色,四个轮子
行为:驾驶、刹车
JavaScript中的对象
JavaScript中的对象其实就是生活中大型的一个抽象
JavaScript的对象是无序属性的集合
其属性可以包含基本值、对象或函数、对象急速一组没有顺序得知。 我们可以把JavaScript中的对象想象成键值对,其中值可以是数据和函数。
对象的行为和特征
特征——在对象中用属性表示
行为——在对象中用函数表示
对象字面量
创建一个对象最简单的方式是使用对象字面量赋值给变量。类型数组。
对象字面量语法:{}
内部可以存放多条数据,数据与数据之间用逗号分隔,最后一个后面不要加逗号。
每条数据都是有属性名和属性值组成,键值对写法:k:v
k:属性名
v;属性值,可以是任意类型的数据,比如简单类型数据、函数、对象。
<script>
var App = {
name: "手机",
color: "白色",
game: "听音乐",
info: function () {
console.log(123);
console.log(this);
console.log(this.game);
}
}
console.log(App.name)
console.log(App["color"])
App["info"]()
// 删除属性;
delete App.color
// 新增属性;
App.sm = 10086
// 修改属性;
App.color = "红色"
</script>
区分属性和方法
属性:对象的描述性特征,一般是名词,相当于定义在对象内部的变量。
方法:对象的行为和功能,一般是动词,定义在对象中的函数。
调用对象内不熟悉和方法的语法
用对象的变量名打点调用某个属性名,得到属性值。
在对象内部用this打点调用属性名。this替代对象。
用对象的变量名后面加[]调用,[]内部是字符串格式的属性名。
调用方法是时,需要在方法名后加()执行。
更改对象内部属性和方法的语法
更改属性的属性值方法为:先调用属性,在等号赋值、
o.age=19;
增加新的属性值和属性值:使用点语法或者[]方法直接定义新属性,等号赋值
o.height=180;
删除一条属性;使用一个delete关键字,空格后面加属性调用。
delete o.sex;
其他创建对象的方式
new Object()创建对象
object()构造函数,是一种特殊的函数。 主要用来在创建对象时初始化对象,即为对象成员变量赋初始化值,总与new运算符一起使用在创建对象的语句中
1.构造函数用于创建一类对象,首字母要大写。
2.构造函数要和new一起使用才有意义
<script>
//利用new Object创建对象
var obj = new object(); // 创建了一个空的对象
obj.uname ='张三疯';
obj.age = 18;
obj.sex ='男';
obj.sayHi = function() {
console.log( 'hi~');
}
// (1)我们是利用等号=赋值的方法 添加对象的 属性和方法
// (2)每个属性和方法之间用 分号 结束
console.log(obj.uname);
console.log(obj[ 'sex']);
obj.sayHi();
</script>
new在执行时会做四件事情
1.new会在内存中创建一个新的空对象
2.new会让this指向这个新的对象
3.执行构造函数目的:给这个新对象加属性和方法
4.new会返回这个新对象
工厂函数创建对象
如果要创建多个类型的对象,可以将new Object()过程封装到一个函数中,将来调用函数u就能创建一个对象,相当于一个生产对象的函数工厂,用来简化代码
<script>
// 使用工厂方法创建对象
function aaa(name,age,color){
var bbb=new Object;
bbb.name=name;
bbb.age=age;
bbb.color=color;
return bbb;
}
var a=aaa("小红","21","pink");
var b=aaa("小于","20","white");
console.log(a);
console.log(b);
</script>
自定义构造函数创建对象
比工厂方法更简单。
自定义一个创建具体对象的构造函数, 函数内部不需要new一个构造函数的过程,直接使用this代替对象进行属性和方法的书写,也不需要return一个返回值。
使用时,利用new关键字调用自定义的构造函数即可。
注意:构造函数的函数名首字母需要大写,区别于其他普通函数名
自定义构造函数案例
<script>
//利用构造函数创建对象
//我们需要创建四大天王的对象︰相同的属性:名字年龄性别﹐相同的方法:唱歌//构造函数的语法格式
// function构造函数名(){
// this.属性=值;
// this.方法= function(){}
// }
// new构造函数名();
// 1.构造函数名字首字母要大写
// 2.我们构造函数不需要return就可以返回结果
// 3.我们调用构造函数必须使用new
// 4.我们只要new Star()调用函数就创建一个对象 ldh
function Star(uname, age, sex){
this.name = uname;
this.age = age;
this.sex = sex;
this.sing = function(sang) {
console.log(sang);
}
}
var ldh = new Star('刘德华', 18,"男");
console.log(typeof ldh);
console.log( ldh.name);
console.log( ldh['sex']);
ldh.sing( '冰雨');
var zxy = new Star('张学友',19,"男");
console.log(zxy.name);
console.log(zxy.age);
</script>
对象遍历
for in循环也是循环的一种,专门用来遍历对象,内部会定义一个k变量,k变量在每次循环时会从第一个开始接受属性名,一直接收到最后一条属性名,执行完全后跳出循环。
简单的玄幻遍历:输出每一项的属性名和属性值。
//循环遍历输出每一项
<script>
for(var k in obj){
console.log(K+"项的属性值是:"+obj[k]);
}
//遍历对象
var obj = {
name: 'pink老师',
age: 18,
sex:'男',
fn:function(){
}
}
// console.log(obj.name);
// console.log(obj.age);
// console.log(obj.sex);
// for in遍历我们的对象ll for(变量 in对象){}
for (var k in obj) {
console.log(k);
// k变量输出得到的是属性名
console.log(obj[k]);
}
// obj[k]得到是属性值
</script>
简单类型和复杂类型
掌握简单类型和复杂类型的区别
简单类型和复杂类型的区别
我们已将学习过简单类型数据和一些复杂类型的数据,现在来看一下他们之间的区别有哪些
基本数据类型又叫值类型,复杂类型又叫做引用类型
值类型:
简单数据类型,基本数据类型,在存储时变量中存储的是值本身,因此叫做值类型。
引用类型:
复杂数据类型,在存储时,变量中存储的仅仅是地址(地址),因此叫做引用数据类型
堆跟栈
JavaScript中没有堆和栈的概念, 此处我们用堆和栈来讲解,目的是方便理解和方便以后的学习
堆跟栈空间分配区别:
1.栈(操作系统):由错做系统自动分配释放,存放函数的参考值,局部变量的值。
2.堆(操作系统):存储复杂类型(对象),一般由程序员分配释放,若程序员不释放,由垃圾回收机制回收。
基本类型在内存中 的存储
变量中如果存储的是简单类型 的数据,那么变量中存储的是值本身,如果讲变量赋值给另一个变量,是将内部的值复制给另一个变量,两个变量之间没有联系,一个变化,另一个不会同时变化。
基本 类型座位函数的参数
复杂类型在内存中的存储
如果讲复杂类型的数据赋值给一个变量,复杂类型的数据会在内存中创建一个原型,而变量中存储的是指向对象的一个地址,如果将变量赋值给另一个变量,相当于将地址赋值一份给了新的变量,两个变量的地址相同,指向的是同一个原型,不论通过那个地址更改了原型,都是原型上发生的更改,两个变量下次访问时,都会发生变化。