JS对象

104 阅读2分钟

对象

对象的创建:

第一种方式:对象字面量形式(属性、方法、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(){}