对象
对象的创建:
第一种方式:对象字面量形式(属性、方法、get set型属性)
//例子
var p = {
name: "Dj",//属性
work: function(){//方法
console.log("working...");
},
_age: 18,
get age(){//get型属性
return this._age;
},
set age(val){//set型属性
this._age = val;
},
address:{//属性中嵌套属性,调用时用p.address.home
home: "shenzhen",
office: "my dream work place"
}
};
console.log(p.name);//调用的两种方式,不存在时返回undefined
console.log(p["age"]);//调用
//若var o = {1: "abc"},只能用p["1"]访问
//var result = p && p.address && p.address.home
//若其中一个为不存在,则返回空;若都存在,返回p.address.home
第二种方式:构造器创建对象
//例子
var o = new Object();
o.name = "xxx";
o["abc"] = "abc";
//也可以用Object.defineProperty和Object.defineProperties增加属性
//o为对象,yy为属性名,value: 100为属性值,writeable: false为不可改,像这些属性特性不写则默认为false
Object.defineProperty(o, "yy", {value: 100, writeable: false});
//添加多个属性
//属性{...}里可写get set writeable(写) enumerable(枚举) configurable(配置) value
Object.defineProperties(p, {
salary:{
value: 100,
writeable: false
},
gender:{
value:true
},
height:{
get: function(){
return 180;
},
set: function(val){
console.log(val);
}
}
})
对象成员遍历
第一种方式
for(sx in o){
console.log(sx);
console.log(o[sx]);//sx是变量了,在这不可以用o.sx这种方式
}
//无序遍历,成员的先后顺序不确定,enumerable为false则不可遍历
第二种方式
Object.keys(o);
//返回一个包括属性名的数组,可以对数组排序后遍历数组来达到有序遍历的效果
检查对象是否具有某种属性
"name" in o;//返回true
//或者
o.hasOwnProperty("name");//返回true,只有对象自己有的属性才返回true,父类继承的属性返回false
成员的删除
delete o.name;//像有些toString这种window自带的删不掉
成员特性
writeable enumerable configurable
对象工厂
var o = {
name: "Dj",
age: 12
}
var o1 = o;//此时o和o1指向同一个地方
//对象工厂
function PersonFactory(pname, page){
//命名规范:若相当于类,首字母大写;若相当于函数,首字母小写,驼峰式
return {
name: pname;
age: page;
headCount: 1;
}
}
var p1 = PersonFactory("Dj", 22);
var p2 = PersonFactory("Nice", 27);
//优点:p1和p2二者完全独立,缺点:共同的东西headCount多占内存
类型检测
//typeof
typeof 1;//number
typeof true;//boolean
//instanceof
var o = {};
o instanceof Object;//ture
o instanceof o.constructor;//true
new Number(123) instanceof Number;//true//new Number(123)相当于创建了一个对象
关于原型的三个属性
//hasOwnProperty
//对象.hasOwnProperty("属性")//自身没有这个属性,原型里有也不行,因为对象和原型对象是两个对象
//isPrototypeOf
//原型.isPrototypeOf(对象)//注:和instanceof使用方法不一样,对象 instanceof 函数
//getPrototypeOf
//Object.getPrototypeOf(对象)//获取原型
function F(){};
var f = new F();
f.name = "Dj";
f.hasOwnProperty("name");//true
F.property.age = 22;
f.hasOwnProperty("age");//false
F.prototype.isPrototypeOf(f);//true
Object.getPrototypeOf(f);//F(){}