JS中的原型与原型链的简单理解
原型
定义:
prototype(原型): 原型(prototype)是function对象的一个属性,它定义了构造函数制造出的对象的公共祖先(公共的属性和方法)通过该构造函数产生的对象,可以继承改原型的属性和方法。 原型也是对象。
_proto_(隐式原型):每个对象的__proto__属性指向自身构造函数的prototype;
constructor (构造器):返回对创建此对象的数组函数的引用。
使用原型对象可以让所有对象实例共享它包含的属性和方法:
function Person(){
}
Person.prototype.name="shawn";
Person.prototype.age="21";
Person.prototype.sayname=function(){
alert(this.name)
}
var person1=new Person()
person1.sayname(); //shawn
var person2=new Person()
person2.sayname(); //shawn
alert(person1.name==person2.name);//true
深入了解:对比prototype、constructor、_proto_
构造函数Person
Person.prototype指向构造函数原型
Person._proto_指向 ƒ () { [native code] }
Person.constructor(构造器)指向Function
实例对象person1
person1.prototype为undefined
person1._proto_ 指向构造其本身的构造函数的原型
person1.constructor指向构造其本身的构造函数
我们再引入一个普通的函数做同样的操作得出对比:
指向 | prototype | constructor | _proto_ |
构造函数 | 构造函数的原型 | Function | ƒ () { [native code] } |
实例对象 | undefined | 构造其本身的构造函数 | 构造其本身的构造函数的原型 |
普通函数 | 一个包含construct和__proto__的对象 | Function | ƒ () { [native code] } |
原型链
定义:
原型链是实现继承的主要方法
基本思路就是利用原型让一个引用类型继承另一个引用类型的属性和方法。
每个构造函数都有一个原型对象,原型对象都包含一个指向构造函数想指针(constructor),而实例对象都包含一个指向原型对象的内部指针(__proto__)。如果让原型对象等于另一个类型的实例,此时的原型对象将包含一个指向另一个原型的指针(__proto__),另一个原型也包含着一个指向另一个构造函数的指针(constructor)。假如另一个原型又是另一个类型的实例,如此层层递进,这就构成了实例与原型的链条。这就是原型链的基本概念
实现原型链的基本模式(继承):
function SuperType(){
this.property=true;
}
SuperType.prototype.getSuperValue=function(){
return this.property;
}
function SubType(){
this.subproperty=false;
}
//继承了SuperType
SubType.prototype=new SuperType();
var instance=new SubType();
alert(instance.getSuperValue())//true
最后引用一张图,更好的理解原型链