Js属性
1. 设置属性
1) 对象.
2) 对象[‘属性名’]
3) GetAttribute函数
2. 获取属性
1) 变量=对象.
2) 变量=对象[‘属性名’]
3) GetAttribute函数
点和[]的区别:
1.访问关键字和保留字属性时只能使用[]
2.通过名称遍历属性时只能使用[]
1 obj['class'] //class是保留字,E3是保留字,E5在非严格模式下依然是保留字 2 obj['for'] //for是关键字 3 //第5 版对使用关键字和保留字的规则进行了少许修改。关键字和保留字虽然仍然不能作为标识符使用,但现在可以用作对象的属性名。一般来说,最好都不要使用关键字和保留字作为标识符和属性名,以便与将来的ECMAScript 版本兼容。
4 function displayProp(obj){ 5 var names=""; 6 for(var name in obj){ 7 names+=name+": "+obj[name]+", "; 8 } 9 alert(names); 10 }
3. 删除属性
1) Delete 对象.
2) Delete 对象[‘属性名’]
1 delete person.age //即person不再有属性age 2 3 delete person['age'] //或者这样
delete只是断开属性和宿主对象的联系,而不会去操作属性中的属性
1 var a = {p:{x:1}}; 2 var b = a.p; 3 console.log(a.p.x); //1 4 delete a.p; 5 console.log(a.p.x); //TypeError a.p is undefined 6 console.log(a.p); //undefined 7 console.log(b.x); //1 8
delete只能删除自有属性,不能删除继承属性(要删除继承属性必须从定义这个属性的原型对象上删除它,当然,这会影响到所有继承来自这个原型的对象)
1 function inherit(p){ 2 if(p == null){ // 不能从null中继承 3 throw TypeError(); 4 } 5 if(Object.create){ //如果有这个方法就直接使用 6 return Object.create(p); 7 } 8 var t = typeof p; 9 if(t !== "object" || t !== "function"){ //要继承的对象 类型要符合 10 throw TypeError(); 11 } 12 function f(){ }; //定义一个空的构造函数 13 f.prototype = p; //原型指向要继承的对象p 14 return new f(); //创建f对象,此对象继承自p 15 } 16 17 var obj = {x:1}; //用来构造函数 18 var obj1 = inherit(obj); 19 obj1.y = 2; 20 console.log("x = "+obj1.x+" y = "+obj1.y); //x = 1 y = 2 21 delete obj1.x; 22 delete obj1.y; 23 console.log("x = "+obj1.x+" y = "+obj1.y); //x = 1 y = undefined x是原型创建的,y是obj变量本身的属性,所以只有y可以被删除
可配置属性才能使用delete
1 delete Object.prototype; // 不能删除 原型链不可配置 2 3 function f(){ } 4 delete this.f; //不能删除,函数是变量,是不可配置的 5 6 var x = 1; 7 delete this.x; //不能删除 是变量,是不可配置的 8 9 this.y = 1; 10 delete y; //这样可以删除,已经成为本身变量 11
4. 检测属性
1) in
2) hasOwnProperty()或者propertyIsEnumerable()
3) !==
in 运算符希望它的左操作数是一个字符串或者可以转换为字符串,希望它的右操作数是一个对象
1 var data = [5,6,7]; 2 console.log("0" in data); //有下标0 3 console.log(1 in data); //1可以转换成"1" 4 console.log("4" in data); //下标只有 1 2 3 5 6 var obj = {x:1}; 7 console.log("x" in obj); //true 8 console.log("y" in obj); //false 9 console.log("toString" in obj); //true 因为obj继承了这个方法
使用hasOwnProperty()或者propertyIsEnumerable() --- 后者是前者的增强
1 var obj = {x:1}; 2 console.log(obj.hasOwnProperty("x")); //true 3 console.log(obj.hasOwnProperty("y")); //false 4 console.log(obj.hasOwnProperty("toString")); //false 因为obj继承了这个方法,但不是它自己的
只有检测到是自由属性并是可枚举的属性时,后者才返回true
var obj = {x:1}; console.log(obj.propertyIsEnumerable("x")); //true console.log(obj.propertyIsEnumerable("y")); //false console.log(obj.propertyIsEnumerable("toString")); //false 因为obj继承了这个方法,但不是它自己的 console.log(Object.prototype.propertyIsEnumerable("toString")); //false 因为最原始的的 toString就是不可枚举的
可以直接用 ”!=="运算符判断
1 var obj = {x:1}; 2 console.log(obj.x !== undefined);//true 3 console.log(obj.y !== undefined);//false 4 console.log(obj.toString !== undefined); //true
5. 枚举属性
1 var obj = {x:1,y:2}; 2 for(p in obj){ 3 console.log(p);//x y 4 console.log(obj.p);// undefined undefined 5 console.log(obj[p]);//1 2 6 }