介绍
面向过程&面向对象
类 - Class
构造函数
初始化过程

如果构造函数返回的不是一个对象或函数,则返回创建的新对象(下方代码)
function _new() {let target = {}; //创建的新对象//第一个参数是构造函数let [constructor, ...args] = [...arguments];//执行[[原型]]连接;target 是 constructor 的实例target.__proto__ = constructor.prototype;//执行构造函数,将属性或方法添加到创建的空对象上let result = constructor.apply(target, args);if (result && (typeof (result) == "object" || typeof (result) == "function")) {//如果构造函数执行的结构返回的是一个对象,那么返回这个对象return result;}//如果构造函数返回的不是一个对象,返回创建的新对象return target;}因此,我们使用new来调用函数的时候,就会新对象绑定到这个函数的this上。function sayHi(name){this.name = name;}var Hi = new sayHi('Yevtte');console.log('Hello,', Hi.name);输出结果为 Hello, Yevtte, 原因是因为在var Hi = new sayHi('Yevtte');这一步,会将sayHi中的this绑定到Hi对象上。
实例成员 & 静态成员
原型链
原型对象 prototype
对象原型 - proto
Star.prototype === ldh.__proto__
constructor

一般用 XX.prototype.YY 来给原型添加对象或方法,也可以采用下方式
对象实例上的constructor通过原型链找原型对象, 再通过原型对象指向构造函数
完整原型链
查找机制
扩展内置对象
继承
利用call继承属性
Father.call(this,x,x) 因为call会指向函数, 这里相当于给Son添加了Father的属性 因为this.x添加了新的。
利用原型对象继承方法
Son.prototype = newFather( ) 这样Son就可以通过prototype指向父亲实例对象,父亲实例对象再通过proto此找到父亲的的原型对象调用方法。
//父对象
function Father(){};
//父对象添加方法
Father.prototype.money = function(){};
//子对象
function Son(){}
//继承父类型方法
Son.prototype = new Father();
//子给自己添加方法 不影响父
Son.prototype.exam = function(){}
原理图

