理解对象
对象属于一中复合的数据类型,里面可以保存不同的数据类型和方法。
创建对象
1 利用构造函数创建
var person=new Object();
person.name="renjialei";
person.age=18;
2 对象字面量创建
var person={
name:"renjialei",
age:18
}
浏览对象的属性
使用for in语句可以访问对象的属性值。
var obj = {
"name": "wjy",
"age": 26,
"sex": "female"
}; //定义一个object对象
var keys = []; //定义一个数组用来接受key
var values = []; //定义一个数组用来接受value
for (var key in obj) {
keys.push(key); //key返回的是对象的属性
values.push(obj[key]); //取得value ,这里是属性值。
alert(eval("obj." + key)); //循环内逐一打印value值
}
alert(obj.name); //wjy
alert("keys is :" + keys + " and values is :" + values)
var obj = {
"name": "wjy",
"age": 26,
"sex": "female"
}; //定义一个object对象
obj.__proto__.color = "red";
var keys = [];
var value = [];
for (var key in obj) {
if (obj.hasOwnProperty(key)) {
keys.push(key);
value.push(obj[key]);
}
}
alert(keys);
alert(value);
hasOwnProperty(),这个方法可以只在实例中寻找属性,是js中唯一一个可以在实例中操作而不会牵扯到原型中的方法。返回的结果是true和false。
属性类型
数据属性
要修改属性的默认值,必须使用ECMScript5的Object.defineproperty()方法。
在调用Object.defineProperty()方法时,如果不指定, configurable, enumerable, writable特性的默认值都是false . 也就是说使用这个方法定义的对象属性是不可修改的也是不可删除的!
【writable】 该属性是否可写,如果设置成 false,则任何对该属性改写的操作都无效(但不会报错),对于像前面例子中直接在对象上定义的属性,这个属性该特性默认值为为 true。
Object.defineProperty(person,"name",{
value:"renjialei",
writable:false
})
person.name="gaochi";
【configurable]】如果为false,则任何尝试删除目标属性或修改属性以下特性(writable, configurable, enumerable)的行为将被无效化,对于像前面例子中直接在对象上定义的属性,这个属性该特性默认值为为 false。
var person={};
Object.defineProperty(person,"name",{
value:"renjialei",
configurable:false
})
delete person.name;
【enumerable】 是否能在for-in循环中遍历出来或在Object.keys中列举出来。对于像前面例子中直接在对象上定义的属性,这个属性该特性默认值为为 true。
JS包装类
基本类型值不是对象,因而从逻辑上讲,没有方法。实际上,当每读取一个基本类型值时,后台会创建一个基本包装类型的对象。但这种自动创建的基本包装类型的生命周期极短,基本上一行代码执行完,也就销毁了。通过new操作符实现的包装类则在执行流离开当前作用域前都一直保存在内存中。
var arr="abcd";
//new String("string")=2;
arr.length=2;
console.log(arr);
观察上面代码, 后台自己进行了包装,但随后将其释放。
函数
定义函数
第一种是函数声明方式;牵扯到函数声明提升。
sayhi();
function sayhi(){
alert("hello");
}
第二种是函数表达式,无声明提升。
var sayhi=function(){
alert("hello");
}
sayhi();
还有一中函数叫做立即执行函数,里面也可传递参数
(function(){
alert("renjialei");
})();
方法
当在对象中调用一个函数时,即将函数作为属性的属性值。调用的过程我们称作是方法的调用。另外就是this的使用。
var name="window";
var object={
name:"jubu",
sayname:fun
}
function fun(){
alert(this.name);
}
object.sayname();
根据调用方式的不同this所代表的对象发生转变。
function Person(name,age,job){
this.name= name;
this.age=age;
this.job=job;
this.sayname=function(){
alert(this.name);
}
}
var person1=new Person("renjilaei",18,"xuesheng");
alert(person1.constructor==Person);
上面将this转换为了person对象。