function Test (name,age){ //构造函数,构造函数名第一个字母必须大写
this.name = name
this.age = age
this.say = function(){} // 此函数虽然实例也可以访问,但是有一个弊端,实例对象与构造函数访问此方
法时都会各自开辟一个新的内存,所以浪费了计算机资源
}
Test.prototype.sing = function(){} // sing是原型对象的方法,实例和构造函数都可以访问,也叫共享方法
let t1 = new Test() // 通过new关键字,创建一个实例对象t1
// 实例对象身上有一个 __proto__ 属性,构造函数身上有一个prototype属性
// __proto__(隐式原型) 它指向 prototype(原型对象),所以 t1.__proto__ === Test.prototype
// 所以实例对象也可以访问到构造函数中 原型对象身上的方法
// 实例对象和原型对象身上有一个 constructor(构造器),都指向自身的构造函数
构造函数中的原型对象中有个隐式原型,隐式原型指向顶层的Object中的原型对象,Object原型对象中的constructor (构造器)指向Objec构造函数,而Obejct中的__proto__(隐式原型指向null),此时所有原型构成像一条链子一样,我们统称为原型链