23.JavaScript原型和原型链

可莉
• 阅读 617

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. 在原型链中依次查找是否拥有该成员,如果有直接使用

点赞
收藏
评论区
推荐文章
ZY ZY
2年前
js继承的几种方式
1.原型链继承原型链继承:想要继承,就必须要提供父类(继承谁,提供继承的属性)//父级functionPerson(name)//给构造函数添加参数this.namename;this.age10;this.sumfunction()console.log(this.name)//原
Souleigh ✨ Souleigh ✨
3年前
Js中 constructor, prototype, __proto__ 详解
本文为了解决以下问题:__proto__(实际原型)和prototype(原型属性)不一样!!!constructor属性(原型对象中包含这个属性,实例当中也同样会继承这个属性)prototype属性(constructor.prototype原型对象)__proto__属性(实例指向原型对象的指针)<br/首先弄清楚几个概念:<br/
菜园前端 菜园前端
11个月前
前端学习重点-原型与原型链
原文链接:什么是原型?每一个函数都包含一个prototype属性,这是一个指针指向"原型对象"(prototypeobject),也就是我们平时说的原型。每一个函数都包含不同的原型对象。当将函数用作构造函数的时候,新创建的对象(实例)会从原型对象上继承属性
明月 明月
1年前
JS数据类型的几种判断方法
1.typeof(常用)typeof是一个运算符,返回值是一个字符串,用来说明变量的数据类型,可以用来判断number,string,object,boolean,function,undefined,symbol这七种类型.2.instanceof(知道即可)instanceof运算符用于检测构造函数的prototype属性是否出现在某个实例对象的原型链上,返回值为布尔值,用于指示一个变量是否属于某个对象的实例3.Object.prototype.to
Stella981 Stella981
2年前
Javascript 是如何体现继承的 ?
js继承的概念js里常用的如下两种继承方式:原型链继承(对象间的继承)类式继承(构造函数间的继承) 由于js不像java那样是真正面向对象的语言,js是基于对象的,它没有类的概念。所以,要想实现继承,可以用js的原型prototype机制或者用apply和call方法去实现在面向对象的语言中,我们使用类来创建一个自定义对象
Wesley13 Wesley13
2年前
JS函数高级
原型与原型链所有函数都有一个特别的属性:prototype:显式原型属性所有实例对象都有一个特别的属性:__proto__:隐式原型属性显式原型与隐式原型的关系函数的prototype:定义函数时被自动赋值,值默认为{},即用为原型对象
Wesley13 Wesley13
2年前
JS原型、原型链深入理解
原型是JavaScript中一个比较难理解的概念,原型相关的属性也比较多,对象有”prototype”属性,函数对象有”prototype”属性,原型对象有”constructor”属性。原型是JavaScript中一个比较难理解的概念,原型相关的属性也比较多,对象有”prototype”属性,函数对象有”prototype”属性,原型对
Stella981 Stella981
2年前
JavaScript 基于原型链的继承
JavaScript对象是动态的属性“包”(指其自己的属性)。JavaScript对象有一个指向一个原型对象的链。当试图访问一个对象的属性时,它不仅仅在该对象上搜寻,还会搜寻该对象的原型,以及该对象的原型的原型,依次层层向上搜索,直到找到一个名字匹配的属性或到达原型链的末尾。遵循ECMAScript标准,someObject.Prototype
Wesley13 Wesley13
2年前
ES6面向对象
ES6面向对象js中的面向对象functionUser(name,age){this.namename;//定义属性this.ageage;}//通过原型添加方法User.prototype.showNamefuncti
Stella981 Stella981
2年前
Javascript 构造函数和类
1.构造函数构造函数的名称一般都是首字母大写挂载在this上面的属性为实例属性,实例属性再每个实例间都是独立的原型链属性通过prototype添加,他是所有实例共享的类方法/静态属性只能由构造函数本身访问当实例属性和原型链上的属性重名时,优先访问实例属性,没有实例属性再访问原型属性大多数浏览器的ES5实现之中,每一个对象都有\_\_pr