说道对象,我想起了在其它语言上说的一句话---万物皆对象,在世间任何一个东西都有它自己的属性和特别方法,
这里可以说它自己的用途。
JavaScript对象
最基础的对象需要明白:1.对象的定义、2.对象属性的增删改查、3.对象的创建方法。
一、对象的定义
定义对象:对象的定义中既可以有属性也可以有方法。
var obj = {
name : "wang",
age : "20",
eat : function(){
console.log("123");
}
}
二、对象属性的增删改查
1.增。
对象属性的增加,比如说向obj对象中增加一个sex属性。
obj.sex = "sex";
增加对象属性后面必须有值。
2.删
删除对象属性用到delete方法
delete obj.sex;
3.改
修改对象属性值
obj.name = "zhou";
4.查
查找对象属性:访问对象属性和方法使用对象.属性名(方法名)
obj.name;
obj.eat();
当一个变量没定义会报错,当一个属性没定义查询会返回undefined。
三、对象的创建方法
对象的创建方法有两种:一种是对象字面量的创建方法、一种是构造函数的创建方法。
1.对象字面量
var obj = {};
这种方法就是我上述说的那种方法。
2.构造函数。
在系统中有一个系统自带的构造函数:Object(),我们以这个构造函数为基,创建对象,这种创建方法属性值是自己加的
就是上文对象的增功能。
var obj = new Object();
obj.name = ""; //对象属性自己增加
obj.age = ""
也可以自己写自己的构造函数。这里我们看,构造函数,它也是个函数。其实它和普通的函数没有任何区别。
唯一的区别就是构造函数在书写的时候采用大驼峰式书写规则---TheFirstName。
this
在对象中通常会写this.XXX 什么的。在对象中this指的就是对象本身。
我认为我最能记住的就是一句话:this指向当前对象。当前对象就是this所处环境中的对象。
接下来以这种方法写一个构造函数。
function Person(){
this.name = "";
this.age = "";
this.eat = function(){};
}
var person1 = new Person();
var person2 = new Person();
//这样person1和person2都具有了Person的属性和方法
自定义的构造函数而且可以传参
function Person(name,age){
this.name = name;
this.age = age;
this.eat = function(){};
}
var person1 = new Person("wang",20);
var person2 = new Person("zhou",19);
构造函数的内部原理
1.在逻辑的最顶端会生成一个this对象:var thsi ={};
2.然后把自定义添加的this.属性添加到this对象中:执行this.XXX = “XXX”;
3.隐式返回this;
function Person(name,age){
this.name = name;
this.age = age;
//隐式返回this
//如果在这里手动添加一个return {}是不会错的 但是添加 return XX;XX不是对象这就错了,隐式返回值决定这个返回值必须是对象
}
var person1 = new Person("wang",20);
包装类
在JavaScript里面有包装好的类:Number()、String()、Boolean()
在JS代码中只要是原始值是不可以有属性和方法的
在上述三个中的Number()数字对象是可以参与运算的,但是参与运算之后就变成了数字不是对象。
在JS代码中我们有时候要执行它的方法,这时候我们就调用包装类,当用到方法和属性的时候,
这时候会调用包装类,调用之后就会被delete掉。
var str = "abcd";
str.length = 2;
console.log(str.length);
在上述代码中因为str是原始值不能有属性和方法,在调用length属性的时候,系统会调用String()包装类
var str = new String("abcd"); 这时候把str.length = 2;然后delete掉。
当下一步console.log(str.length);时候再次调用String()包装类,var str = new String("abcd");
此时的长度会按照新的类进行检测。所以输出是4。
给大家分享一个题:
var str = "abc";
str += 1;
var test = typeof(str);
if(test.length == 6)
{
test.sign = "typeof的结果返回的可能是String";
}
console.log("test.sign");
//求输出的是什么??
这道题的答案是undefined。这道题和上一题的思路是一样的,但考察的知识点有前面的一点。开始,str += 1
是考察的前面的隐式类型转换,如果不会的话,点击这里。形成abc1这样的字符串。 下一行typeof返回的是string
此时的test的值为string,再下一行test调用String()包装类,动手指头数一下,string是6个字母,此时test.length为6
正确,test包装类delete掉,进入if语句里面。再次调用包装类,注意这个包装类和上面那个不同,是一个全新的。
把后面一串字符串赋值到test.sign里面。再次delete掉。执行console.log()输出。再次调用包装类,此时的这个包装类
是和上面两次包装类没有任何关系,此时的类里面 var test = new String("string");没有任何属性和方法,test.sign
相当于查看test.sign属性。但是里面没有,所以返回undefined。