什么是原型?
- 在js中任何一个函数都有一个prototype属性,原型(prototype)就是函数的一个属性,它指向一个对象;
- .原型就是具有公共属性和方法的对象(在原型中声明的属性和方法,有时也被称为是类的公有属性和公有方法);
- 原型的作用其实就是为类(函数)提供了一个【公共区域】,在这个公共区域中声明的属性和方法能够被所有通过这个类所创建的对象所访问到。减少内存消耗 (作用一:数据共享,节省内存空间;原型二:为了实现继承)
- 原型是一个对象,在原型中通常拥有两个属性:
1 构造器constructor:该属性指向了这个类(函数)本身
2 原型指向__proto__:该属性指向原型本身,提供给通过类创建的对象使用 - 原型分为隐形原型和显示原型
所有引用类型(函数,数组,对象)的实例对象都拥有__proto__属性(隐式原型)
所有函数都拥有prototype属性(显式原型)(仅限函数)
也就是说每个函数都有一个prototype属性,每个对象都有一个__proto__属性
什么是原型链?
- 每一个函数都有一个prototype属性,成为原型,而原型的值也是一个对象,因此它也有自己的原型,这样就串起了一条原型链;原型链的链头是Object,他的prototype比较特殊,值为null;
- 每个函数都有一个prototype属性,它是一个引用变量,默认指向一个空的object对象。当调用一个对象的函数或者是属性的时候,如果在当前对象里面找不到,那么就会在原型对象上逐层寻找;
- 在javascript中,所有的对象都有一个__proto__的属性,它指向了当前对象的原型(prototype)。比如Animal是一个构造函数,它的本质就是一个函数,在js中函数是一等对象。可以说,原型链是原型对象创建过程中的历史记录。
- 每一个对象都会在内部生成一个proto属性,当我们访问一个对象属性的时候,如果在这个对象中不存在这个属性,那么就会在它的proto属性指向的对象中去寻找。一层一层找下去,当最后找到Object.prototype的时候,这条原型链就到头了。
js中new一个对象实例会经过几步?
- 创建一个空对象obj
- 设置这个空对象的__proto__的属性指向构造函数的prototype
- 让构造函数的this指向这个空对象,然后执行构造函数里面的代码
- 如果函数没有return语句,或是return基础类型,返回生成的对象
- 如果函数return了一个引用类型的数据,则最终返回这个引用类型
为什么方法放在prototype原型对象中而不放在构造函数的属性中?
放在Prototype中只需要在构造函数中实现一次加载,在new的实例中只需要_proto_指向此对象即可通过原型链使用此方法;而如果放在构造函数的属性中,每次new实例都需要调用一次,比较浪费性能。
instanceof的原理
instanceof判断实例对象的_proto_属性,和构造函数的prototype属性,是不是同一个引用,所以只要是在原型链上的构造函数都是new实例的构造函数,
都返回true,使用_proto_.constructor === M 进行判断实例是不是构造函数的实例,比Instanceof更严谨。
prototype和__proto__区别和联系?(显示原型和隐式原型)
- 所有引用类型(函数,数组,对象)的实例对象都拥有__proto__属性(隐式原型)
- 所有函数都拥有prototype属性(显式原型)(仅限函数)
- 也就是说每个函数都有一个prototype属性,每个对象都有一个__proto__属性
什么是构造函数?
- 可以用来new的函数就叫构造函数,箭头函数不能用来当做构造函数哦;
- 构造函数的prototype和其实例的__proto__是指向同一个地方的;
- 常见的函数都是Function构造函数的实例
创建一个对象的方法?
- 构造函数创建对象:他创建出来的对象都是Function构造函数的实例
- 字面量创建对象:字面量创建对象的本质就是new Object创建对象
- new Object创建对象
- Object.create创建对象:创建出来的是一个空原型的对象
Function和Object的区别和联系?
- 函数是Function构造函数的实例;对象是Object构造函数的实例;
- Function构造函数和Object构造函数他们两个又是谁的实例呢?
function Object()其实也是个函数,所以他是Function构造函数的实例
function Function()其实也是个函数,所以他也是Function构造函数的实例,没错,他是他自己本身 的实例
整个原型链指向问题的理解?
- 构造函数实例对象的__proto__与构造函数的prototype相等;
- 构造函数也是Function构造函数的实例对象,及构造函数的__proto__与Function函数的prototype相等;
- 字面量(或new Object)创建的对象实例的__proto__与Object的prototype相同;
- function Object()其实也是个函数,所以他是Function构造函数的实例,及 Function.prototype === Object.proto
- function Function()其实也是个函数,所以他也是Function构造函数的实例,及 Function.prototype === Function.proto
- constructor和prototype是成对的,你指向我,我指向你,及 fn.prototype.constructor === fn
- Person.prototype,它是构造函数Person的原型对象,Function.prototype,他是构造函数Function的原型对象;本质肯定都是通过Object()来创建的;则Person.prototype 和 Function.prototype都是构造函数Object的实例,Person.prototype 和 Function.prototype他们两的__proto__都指向Object.prototype
- Object.prototype其实也有__proto__,指向null,那才是原型链的终点
- 原型继承就是,实例可以使用构造函数上的prototype中的方法
参考: https://juejin.cn/post/7007416743215759373