JS面向对象--1.认识对象
对象在JS中有狭义对象和广义对象
所谓的狭义对象 就是用{}这种字面量的形式定义的对象 它是一组属性的无序集合
//狭义对象,就是一组值的封装,除了4个值之外,什么都没有
var obj = {
name: "小明",
age: "12",
sex: "男",
hobby: ['打球','看电视']
}
alert(obj.hobby[1]) //看电视
上面这个对象,表示一个 人 ,里面有4个属性
比如我们现在不用对象 ,而是使用数组来存存储一组刚才的值
var 0 =['小明',12,'男','['打球','看电视']']
alert(o[1]) //Uncaught SyntaxError: Unexpected number
数组只能存储值 ,不能存储健,换句话说,数组里的值 的 "语义"并不详细,对象除了能存储值,还能存储语义。
值 的语义,属于上叫做keys,健
也就是说:对象就是一组值和语义的封装
//广义对象 是一个对象 ,但是你感觉它除了一组属性还有别的东西
比如DOM元素是对象 ,但是和我们刚才说的狭义对象”里面只有一组值 别的什么 都没有“不同
// 下面这个O是一个DOM元素,它也是一个对象
var 0 = document.getElementById('box'); //得到一个DOM对象
alert(typeof o); //object
//下面给这个DOM元素添加属性
o.name = "小 明";
o.age =12;
alert(o.age)
我们通过DOM方法得到了一个DOM对象,此时可以通过点语法来给这个对象添加属性name,sex,hobboy属性。此时可以通过o.name访问他的name属性。此时 ,你不能说主穿上对象 只有name,age,hobby这三个属性,别的什么 都没有。因为这个o 毕竟是有一个HTML标签实体在页面上
//数组也是对象
我们也可以通过点语法 给数组添加属性
arr.name='小红';
arr.age=12;
arr.hobby =['打架','抽烟','喝酒'];
alert(arr.sex);
说 明数组有对象的一切特征,就是能够添加属性,但你不能说这个数组此时只有name age hobby三个属性
别的都没有 ,毕竟他有一组数
函数也是对象 ,但是typeof运算符检测类型 ,返回的结果 是function,不是object,这是系统规定,但是
function也是object
function fun(a,b){
alert(a+b)
}
//此时我们要证明这个fun也是一个对象,怎么证明 ,给他加属性,如果能加上属性就说明是对象
alert(typeof fun); //function
fun.name ='小刚',
fun.age =34,
fun.hobby = ['lol','DOTA','cs']
alert(fun.name)
此时对象添加属性成功,添加了三个属性,但是你不能说这个fun对象就只有三个属性别的什么都没有,因为它毕竟 是一个函数,能够加圆括号执行
再比如,正则表达式也是对象
var regexp = /\d/g;
alert(typeof regexp); //object
regexp.name ='小青';
alert(regexp.name);
添加属性成功 但你不能说它只有这几个属性 毕竟它是一个正则
也就是说 系统内置的所有引用类型值 都是对象 ,他们都能添加自定义属性 并且能够访问这些属性
比如
{}对象
function函数
array数组
regexp正则表达式
DOM元素
window ,document,Math,Date对象
Number,String内置包装构造函数得到的值
但是这些对象除了一组属性之外,还有其他的东西,比如数组还有一组值;比如函数还有一组语句,能够圆括号执行
什么不是对象,就是系统的基本类型值
数字不能加属性,因为数字是基本类型值,不是对象
var a =100;
a.name ='小强';
a.age =12;
alert(a.age); //undefined
//a不是一个对象 a是通过字面量增加的
var str ='你好';
str.haha=123;
alert(str.haha) //undefined
字符串不能加属性,因为字符串是基本类型值,不是对象。
那么到底有什么性质,我们就称它是对象呢?能够添加属性。特别的,微观层面,只要这个东西存放在堆内存中,就可以认为是一个对象。