原型和原型链是我们面试中的重点和难点!今天大伙们一定要一次把它拿下。
原型prototype
每个函数都有一个prototype属性,它默认指向一个object空对象(没有我们定义的属性),即称为原型对象。这里一般讨论构造函数。
其中Objecty也是有原型对象的。
当函数通过构造函数形式调用时,它所创建的对象都有一个隐含的属性:指向构造函数的原型对象,我们可以通过 __proto__
来访问该属性。
原型对象中还有一个contructor
属性,它指向函数对象。
构造函数、实例和原型对象在内存中的关系图1:
图1对应的伪代码如下:
function Myclass(){
// 函数体
}
var mc = new Myclass() // 创建Myclass的实例mc
console.log(Myclass.prototype) // 控制台中输出Myclass的原型对象
给原型对象添加属性/方法。
原型对象的作用:函数的所有实例对象自动拥有原型中的属性/方法。
显式原型与隐式原型
显式原型:每个函数function都有一个prototype
,即显式原型
隐式原型:每个实例对象都有一个__proto__
,即隐式原型
下面举例子了解显式原型和隐式原型在代码中所做的事情
function Person(){
// 函数体
}
var boy = new Person(); //创建Person实例boy
在上面代码中,
function Person(){//函数体}
的内部语句是 this.prototype = {//函数体}
,
new Person();
的内部语句是 this.__proto__ = Person.prototype;
。
对象的隐式原型的值为其对应构造函数的显示原型的值。(关键)
进一步细化构造函数、实例和原型对象在内存中的关系图,
构造函数、实例和原型对象在内存