var obj = {
name: ‘pen’,
age: 18,
song: function () {
console.log(‘i am song’)
}
}
对象属性的删除:
- 删除name: delete obj.name
- 访问一个没有的属性不会报错,会返回‘undefined’:console.log(obj.sex) // undefind
对象的创建方法:
- plainObject 对象字面量/对象直接量: var obj = {}
- 构造函数
- 系统自带的构造函数var obj = new Object()
- Object.create(原型)
- 自定义:
function Person () {}
var son = new Person()
- 系统自带的构造函数var obj = new Object()
构造函数(new实例)隐式转换内部原理:
- 在函数体最前面隐式声明this,并赋值为空对象:var this = {proto: 构造函数.prototype} (this里的隐式属性可不必深究,后面文章有解释)
- 构造函数的this.xxx = xxx,既往this空对象传值
- 隐式的返回this,若我们自定义返回return要想生效必须为对象类型
- return {}, new一个实例时,返回的是空对象,freturn [],返回数组
- return 12, new一个实例时,这里忽略12返回this对象,所以return 返回原始值会不生效
- return {}, new一个实例时,返回的是空对象,freturn [],返回数组
原始值没有属性和方法!
1. 字符串不叫原始值,原始值字符串才叫原始值,他还有字符串对象
2. 数字、字符串、布尔值都有原始值数字、原始值字符串、原始值布尔值和数字对象、字符串对象、布尔值对象
3. 包装类:Number()、String()、Boolean()
但是例子1:
var str = ‘abc’;
str.a = ‘123’;
console.log(str.a) // undefined;
分析;这里系统是这样子执行的:
- 执行到str.a = ‘123’,会被隐士执行new String(‘abc’).a = ‘123’,然后系统销毁a: delete str.a
- 访问str.a时, 系统重新new String(‘abc’).a,系统访问一个对象不存在的值,会返回undefined
例子2:
var str = ‘abc’;
str.length = 2;
console.log(str.lenght) // 3
分析:
1. 执行到str.length = 2时,会隐式执行new String(‘abc’).length = 2; 然后销毁length delete str.length
2. 访问str.length时,系统重新new String(‘abc’).length; 这里的length是包装类String原有的属性,返回 3;
