原型和原型链

原型和原型链,第1张

一、什么是原型
原型:每一个javascript对象(除null外)创建的时候,都会与之关联另一个对象,这个对象就是我们所说的原型,每一个对象都会从原型中’继承’属性。
例如:

var Obj=new Object();

创建一个对象的时候都会同时关联一个对象,关联的这个对象就是新建的对象obj的原型
二、prototype
在Javascript中,每一个函数或者对象都有一个prototype属性,该属性指向函数的原型对象。
当用该函数构造出一些对象之后,这些对象也继承了原型对象上的属性

function Person(){}
Person.prototype.name='protoName'
var person1=new Person()
console.log(persson1.name) //protoName

person1由于本身没用name这个属性,所以它会去构造函数Person找,而Person函数本身也没有name属性,所以会去Person.prototype上面去找,也就是去Person的原型上面找,这就是最基本的原型链了。

三、proto
每一个对象都有一个__proto__属性,他指向该对象的原型

function Person(){}
var person1=new Person()
console.log(person1.__proto__===Person.prototype) //true


四、constructor
每个 原型 都有一个constructor属性(也就是说,constructor是存在于prototype上面的属性),指向该关联的构造函数

function  Person(){}
var person1=new Person()
console.log(Person.prototype.constructor====Person) //true
console.lof(Person.prototype.constructor===person1.constructor) //true

由于person1本身没有constructor属性,所以会沿着原型链向上查找(构造函数Person上面),而构造函数的原型上就有constructor属性,也就是
person1没有constructor属性–>查找Person的constructor属性,
Person没有constructor属性–>查找Person.prototype的constructor属性
五、原型的原型
原型是对象创建的时候关联的另一个对象,那么原型也是一个对象,既然是对象那么原型也应该关联一个对象是原型的原型
那么原型对象创建的时候也会关联一个对象

function Person(){}
var person1=new Person()
console.log(Person.__proto__ === Function.prototype) // true
console.log(Person.prototype.__proto__ === Object.prototype) // true

原型链
每个构造函数都有一个原型对象,原型对象都包含一个指向构造函数的指针,而实例都包含一个指向原型的对象的内部指针,那么假如我们让原型对象等于另一个类型的实例。显然,此时的原型对象将包含一个指向另一个原型的指针,相应的,另一个原型中也包含着一个指向另一个构造函数的指针。假如另一个原型又另一个类型的实例,那么上述关系依然成立。如此层层递进,就构成了实例与原型的链条。这就是所谓的原型链的基本概念。
也就是说假如函数A的原型是函数B的实例对象,而函数B的原型是函数C的实例对象,函数C的原型是函数D的实例对象,那么ABCD就构成了一个原型链
此时如果函数A的实例对象需要去找一个属性X,在函数A找不到的时候,就去函数A的原型上面找,再找不到就去函数B的原型上面找。也就是沿着原型链一层一层查找

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/940704.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-17
下一篇 2022-05-17

发表评论

登录后才能评论

评论列表(0条)

保存