在真正的工作中感受到了javascript的强大,所以准备自学javascript。基础的什么数据类型、表达式、语句等就不写出来了,想必大家对那个都很熟悉了。现在就开始介绍javascript对象吧。
“对象是javascript中基本数据类型”这个是《javascript权威指南》中给出的定义。在我看来对象和我们平时所说的字典非常相似,但是这个“字典”是可以继承的。Javascript中的对象时动态的——可以新增属性也可以删除属性。这个和java或者c++的对象有很大区别,当然java中也可能修改对象属性除非你用特殊的方法。属性包括名字和值,属性名可以是任意的字符串,但是同一个对象中不允许有相同的属性名,属性值可以是任意的javascript值。在进行属性设定的时候我们可以根据需要把一些属性设定为可写、可枚举、可配置等。
属性特性:
可写(writable):表明对象是否可以设置;
可枚举(enumerable):表明是否可以根据for/in进行访问;
可配置(configurable):表明能否修改该属性;
这些特性之间有相互的依赖关系例如:可配置==false那么可写==true也是不能进行设置该属性的。
对象特性:
对象的原型(prototype)指向另一个对象,本对象的属性继承它的原型;
对象的类(Class)是标示对象的标志;
对象的扩展标志(extensiable flag)指明是否可以为该对象添加新属性;
创建对象:
对象直接创建:
var empty={};var point={x:1,y:2}; var book={title:"Javascript",auther:{fistname:"David",subname:"Flangan"}};
通过new进行创建:
var obj=new Object(); var arr=new Array(); var date= new Date();
Object.create:
在介绍之前先介绍一下原型,其实最初的原型是Object.prototype大部分的对象都会继承这个原型。当然对于Array 的对象他们继承Array.prototype和Object.prototype,这一系列的连接就是原型链。object.create()的方法创建一个新对象,其中第一个参数就是对象的原型,第二个可选参数是对属性一些的设置。var obj=Object.create({x:1,y:2});//obj继承了x、y属性
对象属性的操作:
属性的查询:
可以通过(.)或者([ ])运算符获取属性的值。var author= book.author;//得到book的author属性 var name=book["name"];// 获取book的name属性。如果对象自身上没有要查询的属性,就在原型链上进行查询,如果原型链上也没有就返回undefined。
属性的赋值:
假设要给一个对象的属性x赋值,如果x在对象中存在(不在原型链上),那么这个赋值只是修改属性的值。如果对象中不存在这个属性,并且这个对象是可以扩展的就给这个对象添加一个新属性。如果要赋值的属性在原型链上,那么就创建一个同名属性覆盖原型链上的。注意:属性的赋值首先检查原型链,判断是不是允许赋值。
删除属性:
delete运算符可以删除对象的属性,但仅仅是断开属性和对象的连接,不会操作属性中的属性。delete只能删除自有属性不能删除原型链上的。var o={x:1};delete o.x;//删除对象o的x属性。
检测属性:
in检测对象自有和继承的原型链上是否包含眼检测属性,var o={x:1}; x in o;//true y in o;//false
hasOwnProperty用来检测属性是不是自有属性。
propertyIsEnumerable检测属性是不是自有属性并且是不是枚举的。
isPrototypeOf:检测对象之间的关系,p.isPrototypeOf(o);//检测o是不是继承p
属性setter和getter:
存取器属性,如果一个属性有setter和getter中的一个就不能像一般属性进行赋值操作。存取器属性不具有可写性,只有getter那么只读,setter那么只写。如果对象o的原型链上有属性x的setter或getter方法,那么就不能给哦添加x属性。只能通过Object.defineProperty(o,"x",{value:0,writable:true,enumerable:true,configurable:true});
序列化对象:
指将对象的状态转化为字符串,也可以将字符串还原为对象。JSON.stringify()转换为字符串,JSON.parse()还原为对象。