一、定义
ECMA-262把对象(object)定义为属性的无序集合,每个属性存放原始值、对象或函数。严格说为无特定顺序的值的数组。
二、创建
1、plainObject--> 对象字面量/对象直接量
var obj = {};
例:
var obj = {
name: 'bob',
age: 23,
say: function (){
console.log(this.name);
}
}
//调用属性:对象.属性名
console.log(obj.name); //bob
//调用方法
obj.say(); //bob
对象的添加:对象.属性名 = 属性值
obj.sex = "male";
对象的修改:重新赋值 对像.要修改的属性名 = 新的属性值
obj.age = 25;
对象的删除
delete obj.sex; //返回true删除成功
但是:注意--delete obj.aaa;也返回true,即delete删除对象没有的属性名也会返回true,但是delete obj; 返回false;即delete不能删除var 声明的变量,当再次访问已删除的属性,返回undefined
2、构造函数
1)系统自带的构造函数 new Object(); new Array(); new Number(); new Boolean(); new String(); new Date(); new RegExp(); ...
注意:若构造函数没有参数,括号则不是必须的
var obj = new Object();
obj.name = "anna";
obj.age = 20;
obj.say = function (){
console.log(this.age);
}
console.log(obj.name); //"anna";
console.log(obj.say()); //20
2)自定义 var 对象名 = new 构造函数 (构造函数如果不用new实例化对象,就是普通函数)
注意:为了区分普通函数,自定义的构造函数一般首字母大写,且使用构造函数创建的对象,this指向该对象本身,而普通函数里面的this指向window
function Person(name,age,ball){
//var this = {
// name: name,
// age: age
}
this.name = name;
this.age = age;
this.hobby = function(){
console.log("I like playing " + ball);
}
//return this;
}
var person1 = new Person('John', 18, 'basketball');//this指向person1
console.log(person1.name); //John
console.log(person1.hobby()); // I like playing basketball
function a(){
var b = 10;
console.log(this);//Window
console.log(this.b);//undefined
}
a();
构造函数的内部原理:
(1)、在函数体最前面隐式声明var this = {};
(2)、执行this.xxx = xxx;
(3)、隐式的返回this
3、Object.create(原型)方法
var obj = {}
var test = Object.create(); //报错,Object prototype may only be an Object or null: undefined
var test = Object.create(obj);
var test1 = Object.create(null); //没有原型
三、遍历对象 for...in..
obj.hasOwnProperty('prop');判断obj对象是否有prop属性,返回true/false
var obj = {
name: 'abc',
age: 20,
grade: [80,90,88]
}
for(var prop in obj){
//console.log(obj.prop); undefined
console.log(prop+':'+obj[prop]); //for in 循环遍历对象,不能用点的形式输出属性,必须永对象[变量名]的形式
//name:abc
//age:20
//grade:80,90,88
}
var str = obj.hasOwnProperty('name'); //obj.hasOwnProperty('prop');判断obj对象是否有prop属性,返回true/false
console.log(str);//true