# 系统内置构造函数

var obj = new Object();

# 自定义构造函数

构造函数也是一个普通函数,创建方式和普通函数一样,但构造函数习惯上首字母大写(唯一的表面区别)

构造函数需要使用new关键字来调用

function Test(opt) {
    this.name = opt.name;
    this.color = opt.color;
}

var test = new Test({
    name: '张三',
    color: '红色'
});

console.log(test);

# 构造函数中的this

没实例化之前this对象不存在,因为Test在GO里面,函数并没执行,GO不看函数里面内容。

在实例化后this将指向实例化的这个对象。

构造函数构造出的实例对象是不同的,

我改变任意一个实例化对象中的属性或者方法,相互之间是不影响的。

this在普通函数中默认指向window。

function Test(name, color) {
    this.name = name;
    this.color = color;
    
    this = {} 默认写了⼀个这句话只是你看不到而已
    // this = {
        // name: name
        // color: color
    }
    
    // return this 隐式的写了一个return this
}

var test = new Test('张三', '红色'});
test被实例化的时候其实就相当于普通函数执行的时候

---

GO = {
    Test: (function)
    test: {
        name: '张三',
        color: '红色'
    }
}

AO = {
    this: {
        name: name,
        color: color
    }
}

当Test被实例化的时候就相当于这个Test被执⾏了,只要他一执行AO就生成

AO⼀生成⾃动的先保存this在AO⾥面去 当你new的时候他就把Test函数里面都跑完了

所以说你在外界能够通过test来访问到这个color 所以说这个test就等于这个this

说⽩了new就是为了改变this的指向


# 模仿构造函数实例化

他this不是隐式的吗 那我手动显式的也能实现

function Test(name, color) {
    var me = {}
    me.name = name;
    me.color = color;
    
    return me;
}

var test = Test('李四', '绿色');
console.log(test);

构造函数显示return时涉及包装类问题这里就不细说了。

下一节讲原型、原型链