对象
为什么要用对象
让参数更少,代码更简洁
什么是对象
1.现实生活中:万物皆对象,对象是一个具体的事物,一个具体的事物就会有行为和特征。比如:一个人、一部手机
2.类和对象
(1)类:描述一类事物,js里可以自定义类,同时也提供了一个默认的类叫做Obiect
比如:类:人类;对象:一个人
js中的对象
1.js中的对象是无序属性的集合,其属性可以包含基本值、对象或函数
2.对象就是一组没有顺序的值,由一组组键值对构成
3.事物的特征在对象中用属性来表示
4.事物的行为在对象中用方法来表示
js中对象的分类
1.内建对象(内置对象)
由ES标准中定义的对象,在任何的ES的实现中都可以使用。Array、Boolean、Date、Math、RegExp、String、Number、Functions、Events
2.宿主对象
有JS的运行环境提供的对象,现在主要指由浏览器提供的对象
比如:BOM对象、DOM对象
3.自定义对象:我们自己创建的对象
对象字面量
字面量:10086,‘小花’,true,null,undefined,[],{}
比如:
var pe = {
// 属性
name : 'hhhh',
age : 18,
sex : '女',
// 行为
dolt: function () {
document.write('我会跳舞!');
}
};
document.write(pe.name); //输出hhhh
创建对象
1.对象字面量(无法赋值)
var pe = {
// 属性
name : 'hhhh',
age : 18, //age是键,18是值
sex : '女',
// 行为
dolt: function () {
document.write('我会跳舞!');
}
};
document.write(pe.name);
键值对通常写法为 name : value (键与值以冒号分割)。
键值对在 JavaScript 对象通常称为对象属性。
2.new Object()创建对象
var xl = new Object();
xl.name = '小耿';
xl.age = 18;
document.write(xl.name + '<br>');
document.write(xl.age);
3.工厂函数创建对象
function person(name, age, sex) {
var p = new Object();
p.name = name;
p.age = age;
p.sex = sex;
// p.doit = function () {
// document.write('我会写代码。');
// };
return p;
}
var xg = person('小耿', 19, '男');
var xf = person('小范', 19, '女');
document.write(xg.name + '<br>' + xf.sex);
4.自定义构造函数(最常用)
function person(name, age, sex) {
this.name = name; //规定要用this
this.age = age;
this.sex = sex;
this.doit = function () {
document.write('我会写代码。');
};
// return this;可有可无,因为这里有个隐藏的return this;
}
var xg =new person('小耿', 19, '男'); //new 函数名(参数)
var xf =new person('小范', 19, '女');
document.write(xg.name + '<br>' + xf.sex);
对象的属性和方法
1.属性
如果一个变量属于一个对象所有,那么该变量就可以称之为该对象的一个属性,属性一般是名词,用来描述事物的特征
xg.name
就是xg
的一个属性
2.方法
如果一个函数属于一个对象所有,那么该函数就可以称之为该对象的一个方法,方法是动词,描述事物的行为和功能
关键字
1.new
(1)new关键字一般和构造函数一起配合使用
(2)构造函数是一种特殊的函数;构造函数用于创建一类对象,首字母要大写(可以不大写);构造函数要和new一起使用才有意义
(3)new做了哪些事
1)new先在内存里创建一个新的空对象;
在堆区开辟了新的空间,栈区存放地址,地址指向空间(对象)
2)new再让this指向这个新的对象;
this通过指向地址再指向堆区的对象
3)执行构造函数,给这个新对象加属性和方法
4)返回这个新对象
把this返回给xg
2.this
1)概念:this是一根指针
2)特点
(1)普通函数执行,内部this指向全局对象window
var s = '张三';
function f() {
document.write(this.s); //this指向window
}
f(); //输出张三
(2)函数在定义的时候this是不确定的,只有在调用的时候才可以确定
(3)如果函数作为一个对象的方法,被该对象所调用,那么函数内的this则指向该对象
(4)构造函数的this是一个隐式对象,类似一个初始化的模型,所有方法和属性都挂载到了这个隐式对象身上,后续通过new关键字来调用,从而实现实例化
对象的使用
1.访问对象的属性
xg.name
或xg['age']
var xg = {
name : '小耿',
age :18,
sex :'男'
}
document.write(xg.name + '<br>');
document.write(xg['age']); //[]里必须是字符串
2.遍历对象的属性
var xg = {
name : '小耿',
age :18,
sex :'男'
}
for(var k in xg){
document.write(k+ ':' + xg[k] + '<br>');
//不能是xg.k,因为k此时是一个字符串
}
2.对象的属性的增、删、改
var xg = {
name : '小耿',
age :18,
sex :'男'
}
delete xg.sex; //delete 关键字
xg.sex = '你猜'; //修改对象的属性
xg.gilr = '小范'; //增添对象的属性
基本数据类型和引用数据类型
注意JS中实际上没有堆和栈的概念 ,但在内存中的表现形式和堆、栈的表现形式一样
1.基本数据类型
基本数据类型又叫做值类型,在存储时,变量中存储的是值本身,因此叫做值类型
String、Boolean、Number、Null、Undefined
2.引用数据类型
引用数据类型又叫复杂数据类型,在存储时,变量中存储的仅仅是地址(引用)
Object
3.区别
(1)JS中的变量都是保存到栈内存中的,基本数据类型的值直接在栈内存中存储,值与值之间是独立存在,修改一个变量不会影响其他的变量
(2)对象是保存到堆内存中的,每创建一个新的对象,就会在堆内存中开辟出一个新的空间,而变量保存的是对象的内存地址(对象的引用),如果两个变量保存的是同一个内存地址,当一个通过变量修改属性时,另一个也会受到影响
4.堆和栈
(1)栈(操作系统):由操作系统自动分配、释放,存放函数的参数值、局部变量的值等
(2)堆(操作系统):存储复杂类型(对象),一般由程序员分配,若程序员不释放,由垃圾回收机制回收
JS中实际上没有堆和栈的概念