原型、原型链:
一、原型:在js中函数可以有属性。 每个函数都有一个特殊的属性叫作原型(prototype)
function Person(a,b){
this.age=a;
this.name=b;
}
console.log("Person的原型:",Person.prototype)
prototype有两个属性:constructor、[[Prototype]]
constructor:每个实例对象都从原型中继承了一个constructor属性,该属性指向了用于构造此实例对象的构造函数,就是表示我创建一个Person对象时会从原型中prototype继承constructor,指向的的是该函数Person(自认为constructor其作用就是知道自己从哪个函数创建的,如果修改当前函数的prototype为某个对象时,constructor就会被替换掉,如果想使用请重新修正)
[[Prototype]]:是隐藏属性,并不能直接访问到,通过__proto__的读取器(getter)来访问,其实可以理解为__proto__就代表[[Prototype]]
**注意**
:__proto__该特性已经从 Web 标准中删除,虽然一些浏览器目前仍然支持它,但也许会在未来的某个时间停止支持,请尽量不要使用该特性。建议使用Object.getPrototypeOf()。
二、原型链:javaScript 常被描述为一种基于原型的语言 (prototype-based language)——每个对象拥有一个原型对象,对象以其原型为模板、从原型继承方法和属性。原型对象也可能拥有原型,并从中继承方法和属性,一层一层、以此类推。这种关系常被称为原型链 (prototype chain),它解释了为何一个对象会拥有定义在其他对象中的属性和方法。
原型继承:每个实例对象(object)都有一个私有属性(__proto__ )指向它的构造函数的原型对象(prototype)。该原型对象也有一个自己的原型对象(__proto__ ),层层向上直到原型对象为null。null作为原型链的最有一个环节
object作为食物链的最顶端,我可以通过实例看出实例对象并非继承了所以object的属性,只是继承了包装的object
//父类
function Person(a,b){
this.age=a;
this.name=b;
}
Person.prototype.getInfo=function(){
return this.name+':'+this.age
}
var person= new Person(20,'张三');
/*****只有函数有prototype:*/
console.log("person的prototype:",person.prototype)/
/*****原型链的体现,__proto__层层向上找直到null*/
console.log("person的__proto__1:",person.__proto__)
console.log("person的__proto__2:",person.__proto__.__proto__)
console.log("person的__proto__3:",person.__proto__.__proto__.__proto__)
/*****对象的内置属性__proto__指向的是函数的prototype*/
console.log("__proto__与prototype:",person.__proto__===Person.prototype)
//子类
function Person2(a,b){
this.age=a;
this.name=b;
}
Person2.prototype=person;
var p2= new Person2(30,'李四');
/*****原型继承*/
console.log("person:",person.getInfo())
console.log("p2",p2.getInfo())
运行结果:
参考文章:
https://developer.mozilla.org...
https://developer.mozilla.org...
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。