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()

    构造函数(new实例)隐式转换内部原理:

    1. 在函数体最前面隐式声明this,并赋值为空对象:var this = {proto: 构造函数.prototype} (this里的隐式属性可不必深究,后面文章有解释)
    2. 构造函数的this.xxx = xxx,既往this空对象传值
    3. 隐式的返回this,若我们自定义返回return要想生效必须为对象类型
      1. return {}, new一个实例时,返回的是空对象,freturn [],返回数组
      2. return 12, new一个实例时,这里忽略12返回this对象,所以return 返回原始值会不生效

    原始值没有属性和方法!
    1. 字符串不叫原始值,原始值字符串才叫原始值,他还有字符串对象
    2. 数字、字符串、布尔值都有原始值数字、原始值字符串、原始值布尔值和数字对象、字符串对象、布尔值对象
    3. 包装类:Number()、String()、Boolean()
    但是例子1:
    var str = ‘abc’;
    str.a = ‘123’;
    console.log(str.a) // undefined;
    分析;这里系统是这样子执行的:

    1. 执行到str.a = ‘123’,会被隐士执行new String(‘abc’).a = ‘123’,然后系统销毁a: delete str.a
    2. 访问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;