欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

23.JavaScript原型和原型链

程序员文章站 2022-07-09 19:46:26
1.原型:prototype,所有的函数都有一个属性prototype,称之为函数原型 默认情况下,prototype是一个普通的Object对象 默认情况下,prototype中有一个属性constructor,它也是一个对象,它指向构造函数本身 function Test(){} Test.pr ......

1.原型:prototype,所有的函数都有一个属性prototype,称之为函数原型

默认情况下,prototype是一个普通的object对象

默认情况下,prototype中有一个属性constructor,它也是一个对象,它指向构造函数本身

function test(){}

test.prototype:函数test的原型

test.prototype.constructor:函数test的原型的构造函数指向test

(test.prototype.constructor === test)  结果为true

 

2.隐式原型:__proto__,所有的对象都有一个属性__proto__,称之为隐式原型

默认情况下,隐式原型指向创建该对象的,函数的原型

function test(){}

var test = new test();

(test.__proto__ === test.prototype) 结果为true

 

上面的test对象如何获得创建对象的构造函数名称?

test.__proto__.constructor.name

test.__proto__ === test.prototype

test.__proto__.constructor === test.prototype.constructor === test

test.__proto__.constructor.name === test.prototype.constructor.name === test.name

 

23.JavaScript原型和原型链

 

 

如上图所示:

通过函数add创建的对象,这些对象的隐式原型都指向函数add的原型

对象1.__proto__ === 对象2.__proto__ === add.prototype

所以add.prototype是对象1和对象2的一块公共区域

 

3.原型链

原型链,链条的全貌:

23.JavaScript原型和原型链

 

 

上图中的function特殊,是js引擎自己产生的

function.__proto__ === function.prototype

object.prototype === null

所有的函数都是通过new function()产生的。

所以,自定义函数.__proto__ === function.prototype

 

当访问一个对象的成员时:
1. 看该对象自身是否拥有该成员,如果有直接使用
2. 在原型链中依次查找是否拥有该成员,如果有直接使用