对于事物我们可以把他们看作是一个对象,而每一个事物都有自己的表示的属性和对于某一信息作出的相应的操作。而这些东西就变成了事物的属性和方法。
在JS中我们可以见到的对象常量有如下的形式:
var obj= {
name:"Arvin",
lastName:"Huang" ,
whatsName:function(){
alert(this.name+" "+this.lastName);
},
}
实际上在JS中的对象就是一个以键值对形式存储属性的一个集合,每一个属性有一个特定的名称,并与名称相对应的值。
其实这种关系是有一个专有名称的,我们可以称之为映射,当然对于对象来说,除了可以通过这种方式来保持自有属性,还可以通过继承的方式来获取继承属性。这种方式我们称作“原型式继承”。
对象创建与对象属性
var built = function(){
var me = this;
me.name = "Arvin";
}
built.prototype = {
toStr:function(value){
alert("there have a " + value);
}
};
var obj = new built();
上面的代码就描述了一种我们常常使用到的一种创建对象的方法,使用new关键字来创建一个拥有独立内存区域和指向原型的指针的对象。当我们使用的new的时候,js解析器会分配一块内存空间,用以存放当前的对象的自有属性。之后解析器会给这一对象一个_proto_属性指向的原型对象内容。
还有一种方式我们称之为对象直接量申明的方式:
var obj = {
name:"Arvin",
toStr:function(value){
alert("there has a "+value);
}
};
对象直接量就是直接通过花括号包裹的键值对的形式来定义当前对象的。每两个值之间的通过逗号来进行分割。键和值之间通过冒号来分割。被解析器读取到当前的内容的时候会自动的生成一个对象的内容并把当前的对象存储在当前上下文中。
还有一种对象创建的方式是使用Object.create()方法,这一方法是ECMAScript5中定义的一个内容,它是一个静态方法,其使用方法如下:
var obj = Object.create({x:1,y:2});//obj继承了属性x和y
//这一方法传入的参数是一个对象,并且这一作用的对象将会作为新的对象的原型存在。
对象属性操作
1.访问属性。
对象属性的访问一般是通过obj.attr的方式来访问的,或者是obj[attr]的方式来进行操作,一般情况之下这样都是可以行的通的,但是属性名称是一些特殊字段的时候就要注意了,例如关键字或是保留字段,这时候我们要通过中括号的形式来访问才可以成功,当然这点在ECMAScript5中的已经更改了,但是在我们平常编写的时候还是要注意变量的命名。对于保留字段尽量不要使用。
属性访问的时候,当对象存在而对象中没有这一属性的时候,如果程序中访问了不存在的属性,js的解析器将会返回undefined的数值,但是如果当前需要访问的对象是不存在的,这个时候js就会返回一个类型错误。
2.属性赋值。
我们可以通过赋值运算来为属性中可写的属性赋值,当访问的对象存在,但是表达式中的属性不存在时候,则会返回一个类型错误。如下:
var obj = {
this.name = "Arvin";
};
obj.lastName = "Huang"; //此时对象将会被赋予一个新的属性为lastName并且其值为Huang
虽然说null和undefined在js中是特有的对象,但是我们也不可以为其设置属性,因为他们都是只读的。而上一段代码中的原理其实就是这个。obj.lastName不存在,所以js返回的额是undefined对象,之后再计算赋值,浏览器会为其添加新的属性来存储当前赋予的值。
我们对于对象中的属性赋值出错的情况会有如下的总结。
- O中的属性是只读的时候,我们对于当前属性是只有访问权限而没有复制权限的。
- O中的某一属性为继承属性的时候,我们是不能对其进行赋值的。
- O中不存在自有属性P,没有继承Setter方法的时候,并且O对象是不可扩展的,则当前的对象是不可定义新的属性的
属性删除:
delete运算符可以删除对象中的属性。这里先讲一下delete运算符的内容。
delete:一元运算符,用于删除对象和数组中的属性,仅仅是删除一个值,并不会返回删除的内容。
var o = {x:1, y:2};//定义了一个对象
delete o.x;
"x" in o; //这里将会得到false值。
var a = [1,2,3];
delete a[1];
2 in a; //元素2已经不再数组中了。
a.length == 3 //这里将会显示为true,虽然删除了属性但是,留下了一个占位,所以数组长度没有变化。
检测属性:
我们经常要判断某一个属性是否存在于某一个对象中。这个时候我们可以通过 in 运算符,hasOwnProperty()方法或是propertylsEnumerable()方法来进行判断。
首先我们来讲一下 in 运算符的内容:in操作符是一个二元操作符,其左边的额数值是字符串或者是可以转化为字符串的,右边的内容是对象。判断的当前的属性是不是存在于对象中。
var point = {x:1};
"x" in point; //这一个表达式最后返回的将会是true。
"toString" in point; //由于toString是继承方法,所以也是返回true.
"z" in point; //这一表达式最后返回false,因为point对象中没有z属性.
//数组可以通过索引来判断当前的数组中是否有相应的数据。
使用in操作符来判断当前的属性是不是存在与某一对象中的。并且即使是继承属性,也是可以测试的。
第二种检测的方法是hasOwnProperty()方法。代码如下:
var o ={x:1};
o.hasOwnProperty("x"); //true:o有这一属性,
o.hasOwnProperty("y"); //false;
o.hasOwnProperty("toString"); //false
hasOwnProperty方法只能测试当前属性是不是对象的自有属性。
第三种检测方式是用propertylsEnumerable()方法。只有当当前的属性是自有属性,并且是可枚举的的时候,这一方法才会返回true.
对象方法:
1、toString()方法
2、toJSON()方法
3、valueOf()方法
参考网址:https://www.cnblogs.com/pingchuanxin/p/5773326.html#part1
对象博大精深,还需重点研究。