// js的 prototype __proto__ constructor
// __proto__ 和 constructor 对象独有
// prototype 函数独有 但是 因为函数也是一种对象 故函数也有 __proto__ 和 constructor
// constructor 该对象的构造函数
// prototype 函数的的属性
// __proto__ 原型链 作用 当访问该对象的某个属性时 若没有 则通过__proto__去定义这个对象的函数里去找
// 又 因为函数也是一种对象 故 返回函数的原始方法 function () { [native code] }
let fun = function () {}
fun instanceof Object // true
fun instanceof Function // true
console.log(fun.__proto__)
console.log(fun.prototype)
console.log(fun.constructor)
console.log('--------------')
let obj = new Object()
console.log(obj.__proto__)
// console.log(obj.prototype) // 报错 因为对象没有
console.log(obj.constructor)
// js 的 new 的过程
// new 就是 通过 构造函数 生成 对象 的过程
// 1、生成一个 空的新对象 (原型)
// 因为 所有对象都有 __proto__ 和 constructor
// 空对象的 两个属性都是原型的 并不是需要new的对象 故需要替换掉 这样才能实现 有迹可循 的定义
// 2、新对象的 __proto__ 指向 构造函数的 prototype
// 此时 空对象的属性就是 构造函数的属性 但是因为 new 生成的是一个新对象 有新的属性
// 故 需要重新执行 构造函数的方法
// 3、执行 构造函数的方法 赋值新属性
// 此时 新对象 拥有了 构造函数的属性和方法 并被 替换了新的属性
// 4、返回该对象
// new的过程就完成了