前端中的“两链一包”:原型链、作用域链、闭包。
原型对象的产生由来:由一个类或者构造函数 实例化生成多个对象 他们都有相同的方法,没有必要给每个设置一份,为解决构造函数中的写方法造成的内存浪费问题,可以将他们放到一个公开的、能被共享的位置去定义 ------ 即原型对象。
js提供的原型对象 它的内容 可以被所有的实例对象继承和共享。
构造函数的prototype是它的原型对象,写进原型对象里:(一种方法是扩展,一种是重写)
//扩展写法
此时原型对象的内容是:console.log(Rectangle.prototype);
constructor属性是用来让实例对象获取它的构造函数 。
原型扩展的方式来设置方法,灵活性很强,可以在随时随地的去扩展方法,但是维护性差,如果希
望 将方法 定义到一起 ,可以考虑使用原型(对象)【重写】
constructor 标记实例对象所属的构造函数,如果没有手动设置 它会继承Object的constructor。
“对象.constructor”常被用来严格区分“对象的类型”。
原型链:原型对象其实是一个链 对象链的顶层是Object.prototype
每个实例对象(object)都有一个隐式原型(__proto__)指向它的构造函数的原型对象(prototype )。
原型对象的__proto__指向另外的一个原型对象,都是对象,都有__proto__属性,层层向上最后找
到的顶级构造函数的原型对象是Object.prototype。(顶级构造函数的原型对象Object.prototype没
有__proto__属性,所以为null)
访问查找原型的属性方法 优先级:
1)先找自身的,如果没有--2)到原型去找,再没有到--3)Object.prototype找
还是没有属性或方法的话,则返回undefined。