JavaScript学习(四)——对象

对象的分类:

1.内建对象

——由ES标准中定义的对象,在任何的ES的实现中都可以使用

——比如,Math  String Number Boolean Function Object....

2.宿主对象

——由JS的运行环境提供的对象,目前来讲主要指由浏览器提供的对象

——比如BOM  DOM

3.自定义对象

——由开发人员自己创建的对象

JS对象的创建:后边的object()是对象的构造函数

var TuBoWen=new Object();
var TuBoWen={};

 

JS对象基本类型属性的添加:

TuBoWen.height=172;
TuBoWen.loving="打篮球、撸铁、漂亮姑娘!!";
TuBoWen.dream="像艾弗森一样突破,像基德一样传球,像吕小军一样强壮";
TuBoWen.LaoSePi="像吕子乔一样把妹";

JS读写对象的方法:

document.write(TuBoWen.height+"</br>");
document.write(TuBoWen.loving+"</br>");
document.write(TuBoWen.dream+"</br>");
document.write(TuBoWen.LaoSePi+"</br>");

JS删除属性的方法:

delete TuBoWen.LaoSePi;

当对象中属性被删除之后,或者属性压根就没有添加,那么就是undefined

JS特殊属性名称的操作:写坑爹属性名会用的到,但是不要这么写,会被打死!!!!

var n="520";
TuBoWen[n]=520;
TuBoWen["520"]=520;
document.write(TuBoWen["520"]+"</br>");

JS检查对象中是否含有某个属性:使用 in 运算符

document.write("LaoSePi" in TuBoWen);

检查我之前删除的属性返回假

JS中的对象是引用数据类型:

这一点很重要,这是JS和C/C++到目前为止,我觉得差异最大的一点了,JS的数据类型中,像Number、String等类型都是基本类型,如果进行了变量名之间的赋值操作,那么两个变量会被存储在不同的空间,而对象不一样,如果进行了变量之间的赋值操作那么两个变量在同一个空间,一个变量属性的修改会牵扯到另一个变量。

1.非引用类型

var what="非引用类型在两个空间";
document.write(what+"</br>");
var how=what;
what="你看是不是?"
document.write(what+"</br>");
document.write(how+"</br>");

2.引用类型

var OtherTu=TuBoWen;
OtherTu.height=182;
document.write(TuBoWen.height);

但是注意,也仅仅是修改属性的时候会出现这种情况,但是如果整体的修改对象就不会产生类似的影响,就相当于此对象放弃了对这块地址的操作权限,和指针很相似。 

OtherTu=null;

还有一点,普通类型逻辑等于判断只判断值。而引用类型还要判断地址和值,都相等了才会返回真值。 

JS的对象也可以在创建对象的同时指定属性和值:

使用这种对象字面量的方法可以在创建对象时,直接指定对象中的属性

语法:var 对象名={

属性名1:属性值,

属性名2:属性值

}

记住也可以把属性名加上双引号,这种操作记住就可以了,没准有人这样写。

对象中也可以写一个属性为对象:下面这一段代码就是直接把Son对象作为外层对象的属性

var New_Placr={
    name:"微信小程序",
    garde:"能照葫芦画瓢",
    "name_2":"单片机",
    garde_2:"一周内完成",
    Son:{
        hey:"我是外层对象的一个子对象"
    }
}
var New_Placr={
    name:"微信小程序",
    garde:"能照葫芦画瓢",
    "name_2":"单片机",
    garde_2:"一周内完成"
}
document.write(New_Placr.name+"——"+New_Placr.garde+"</br>");
document.write(New_Placr.name_2+"——"+New_Placr.garde_2+"</br>");

//创建对象
var TuBoWen=new Object();
//为对象添加基本类型的属性
TuBoWen.height=172;
TuBoWen.loving="打篮球、撸铁、漂亮姑娘!!";
TuBoWen.dream="像艾弗森一样突破,像基德一样传球,像吕小军一样强壮";
TuBoWen.LaoSePi="像吕子乔一样把妹";
//读或者写对象
document.write(TuBoWen.height+"</br>");
document.write(TuBoWen.loving+"</br>");
document.write(TuBoWen.dream+"</br>");
document.write(TuBoWen.LaoSePi+"</br>");
//删除对象的基本类型的属性
delete TuBoWen.LaoSePi;
//再次打印对象中不存在的属性会打印出undefined
document.write(TuBoWen.LaoSePi+"</br>");
//特殊名称表示法
var n="520";
TuBoWen[n]=520;
TuBoWen["520"]=520;
document.write(TuBoWen["520"]+"</br>");
//检查对象中是否含有某个属性
document.write("LaoSePi" in TuBoWen);
document.write("</br>");

//非引用类型
var what="非引用类型在两个空间";
document.write(what+"</br>");
var how=what;
what="你看是不是?"
document.write(what+"</br>");
document.write(how+"</br>");

//引用类型
var OtherTu=TuBoWen;
OtherTu.height=182;
document.write(TuBoWen.height+"</br>");

//整体的修改引用类型
OtherTu=null;

//我自认为很常用的一种方法,尤其微信小程序
var New_Placr={
    name:"微信小程序",
    garde:"能照葫芦画瓢",
    "name_2":"单片机",
    garde_2:"一周内完成",
    Son:{
        hey:"我是外层对象的一个子对象"
    }
}
document.write(New_Placr.name+"——"+New_Placr.garde+"</br>");
document.write(New_Placr.name_2+"——"+New_Placr.garde_2+"</br>");

 JS对象的属性也可以是函数

下面两种添加方法的方式都可以

TuBoWen.play=function(){
    document.write("卧推、深蹲、硬拉绝对肌力"+'</br>');
}
TuBoWen.play();


var op={
    name:"海贼王",
    mainPerson:"Luffy",
    Doing:function(x){
        document.write("寻找"+x);
    }
}
op.Doing("OnePiece");

 JS中枚举对象属性与值:

使用for……in语句

for(var n in op)
{
    document.write("属性名——"+n+"</br>");
    //document.write("属性值"+op.n);不能这样调用属性值
    document.write("属性值——"+op[n]+"</br>");//记住不要像平时那样对n加上双引号
}

工厂方法创建对象:

function crt(x,y,z)
{
    var p=new Object();
    p.name=x;
    p.weight=y;
    p.age=z;
    p.syHelw()=function(){
        document.write("你好!");
    }
    return p;
}

 使用工厂方法创建的对象使用的构造函数都是Object,所以导致创建的对象都是Object这个类型,使得我们无法分出多种不同类型的对象。

构造函数创建不同对象:

创建一个构造函数,专门用来创建某个特定类的对象,构造函数就是一个普通的函数,创建方式和普通函数没有区别,区别就在于调用方式不同,普通函数通过直接调用,构造函数通过new关键字调用。


//构造函数
function men(age,tall,weight,loving){
this.age=age;
this.tall=tall;
this.weight=weight;
this.loving=loving;
}
TBW=new men(19,172,140,"打篮球");
for(var n in TBW){
    document.write(TBW[n]+"</br>");
}

构造函数的执行流程:

1.立刻创建一个新对象

2.将新建的对象设置为函数中this,在构造函数中可以使用this来引用新建的对象

3.逐行执行函数中的代码

4.将新建的对象作为返回值返回

5.使用同一个构造函数创建的对象被称作同一类,而使用instanceof可以检查一个对象是否是一个类的实例

6.调用构造函数时,this就是那个创建的对象

格式:对象名  instanceof  类名

所有对象都是Object的实例

构造函数的优化:

function men(age,tall,weight,loving){
this.age=age;
this.tall=tall;
this.weight=weight;
this.loving=loving;
this.sayName=function(){
    document.write(this.age);
}
}
TBW=new men(19,172,140,"打篮球");
MLT=new men(20,188,180,"泡妹");

像上面这样创建函数对象的话,每使用new构造函数一次就会单独创建一个方法实例,使得程序浪费不必要的空间,我们可以让所有对象实例共用同一个方法依此来节省空间。不同对象的相同方法经过检测是不等的。

function say(){
    document.write(this.age);
}
function men(age,tall,weight,loving){
this.age=age;
this.tall=tall;
this.weight=weight;
this.loving=loving;
this.sayName=say;
}
TBW=new men(19,172,140,"打篮球");
MLT=new men(20,188,180,"泡妹");

而上面这样使用全局来先声明一个函数,再在对象中的某个方法属性中直接赋值的话就可以使得所有对象实例公用同一个方法函数了。不同对象的相同方法经过检测是相等的。

原型对象:

原型 prototype,我们所创建的每一个函数,解析器都会向函数中添加一个属性prototype,这个属性对应着一个对象。当函数以构造函数的形式调用的时候,它所创建的对象中都会有一个隐含的属性指向该构造函数的函数对象,我们可以通过__proto__来访问该属性。

原型对象就相当于一个公共区域,所有同一个类的实例都可以访问到这个原型对象,我们可以将对象中共有的内容统一设置到原型对象中。

当我们访问一个对象的属性或者方法的时候,他会现在对象自身中寻找,如果有则直接使用,如果没有则会去原型对象中寻找,如果找到了则直接使用。

function men(age,tall,weight,loving){
this.age=age;
this.tall=tall;
this.weight=weight;
this.loving=loving;
}
men.prototype.say=function(){
    document.write(this.age+"</br>");
}
men.prototype.a=520;
TBW=new men(19,172,140,"打篮球");
TBW.a=250;
MLT=new men(20,188,180,"泡妹");
document.write("我是TBW对象中特有的a"+TBW.a+"</br>");
document.write("我是类的原型对象中共有的a"+MLT.a+"</br>");

由于直接在全局声明一个函数很不安全,但是为了节省空间我们可以把方法直接加在类的原型对象中。

function men(age,tall,weight,loving){
this.age=age;
this.tall=tall;
this.weight=weight;
this.loving=loving;
}
men.prototype.say=function(){
    document.write(this.age+"</br>");
}
men.prototype.a=520;
TBW=new men(19,172,140,"打篮球");
MLT=new men(20,188,180,"泡妹");
TBW.say();
MLT.say();

所以我们可以把这些对象共有的属性和方法统一添加到构造函数的原型对象中,即省空间又安全。

in运算符可以检测对象中是否含有某个属性,如果对象中没有,但是原型中有,也会返回true。

而hasOwnProperty函数则会来检测对象本身中是否含有该属性。

原型的对象也是对象,所以它也有原型,当我们使用一个对象的属性或者方法时,回现在自身寻找,如果有则直接使用,没有就去原型对象中寻找,还没有的话就继续去原型的原型中寻找,依旧没有找到的话继续这样递归的寻找,直到找到Object对象的原型,Object的原型没有原型,如果在Object中依然没有找到则返回undefined。

toString方法:

我们平常直接打印对象,打印出来的就是他的toString()返回值。想要获取想要的信息可以直接重写类原型的toString方法。不能只修改某个实例的方法。

JS的垃圾回收机制:

JS中拥有自动的垃圾回收装置,我们不必手动操作,会自动的销毁这种垃圾。但是如果在程序结束之前我们没有主动的放弃对内存的引用,浏览器就不能判断是否应该释放这一片空间,所以我们应该对放弃引用空间说明放弃引用。

放弃引用的方法:

对象名 = null

 

 

©️2020 CSDN 皮肤主题: 1024 设计师:上身试试 返回首页