创建对象的方法
- 对象字面量
- 构造函数
- Object.create()
对象字面量:
var obj = {};
//对象中的属性之间用逗号分隔
构造函数:
- 系统自带的构造函数
var obj = new Object();
//系统自带的构造函数有很多,如Number(),String(),Boolean(),Array()
- 自定义的构造函数
其中自定义的构造函数也是正常的函数,为了区分他和正常的函数,将构造函数的首字母大写。
function Person() {}
有了构造函数之后,就可以通过new操作符来创建对象了。
var oPerson = new Person();
另外,构造函数既然是函数,就可以传参数
function Person (name, age) {
this.name = name;
this.age = age;
}
var p = new Person('zhangsan',18);
console.log(p.name); // 这里将打印出zhangsan
为什么通过new操作符可以创建互相独立的对象呢
原因很简单,就是当我们用new操作符创建对象的时候,会隐式的在构造函数里创建一个this对象,而且最终返回的也是这个this对象。
例如:
function Person(age) {
// var this = {};
this.age = age;
//return this;
}
注意:如果最后自己手动返回我们创建的对象,那么将不会在默认的隐式返回this对象了,如:
function Person (name) {
var that = {
name : 'zhangsan'
}
this.name = name;
return that;
}
var oPerson = new Person('lisi');
console.log(oPerson.name); // 这里返回的是'zhangsan',因为我们手动返回的that使得不会隐式的返回this对象了
但是如果我们返回的是不可改变得原始值,而不是对象,那么还是会自动的隐式返回this的,这里我就不做测试啦。
对象属性的增删改查
增
对象名.属性名 = 要添加的属性值
删
function fun(){
this.name = 'mm';
}
var obj = new fun();
console.log(obj.name);//mm
delete obj.name;
console.log(obj.name); //undefined
改
对象名.属性名 = 要添加的属性值
查
对象名.属性名
包装类
var str = 'abcd';
console.log(str.length); // 4
大家可能对上述代码有一点疑问,string类型明明就是原始值,怎么会有属性呢?
这是因为,在调度str.length这一行代码之前,程序会自动把str包装成一个字符串对象,在这一行代码执行完之后再销毁这个字符串对象。
所以当我们在执行str.length = 2;这句话之后,再打印str.length还是4
其他类型的数据也是一样的,当我们给原始值加属性的时候,都是先隐式包装成对象,然后赋属性值之后在销毁这个对象;