原型
原型、原型链及原型继承
在我们了解的一些典型的面向对象语言中,都存在着类的概念,类就是对象的模板,对象就是类的实例。但在 JavaScript 中除了基础类型外的数据类型,都是对象(引用类型),由于其没有类(class,ES6 引入了 class,但其只是语法糖)的概念,如何将所有对象联系起来就成立一个问题,于是就有了原型、原型链及原型继承的概念。
每个实例对象都有一个特殊属性:__proto__(隐式原型属性),并且指向它的 prototype 原型对象,每个函数都有一个特殊属性:prototype(显式原型属性)。每个构造函数都有一个 prototype 原型对象,prototype 原型对象里的 constructor 指向构造函数本身。该原型对象也有一个自己的原型对象( __proto__ ) ,层层向上直到一个对象的原型对象为 null,这个查询的路径就是原型链。根据定义,null 没有原型,并作为这个原型链中的最后一个环节,即为终点。可以参照下图更好地理解原型和原型链:
显式原型与隐式原型的关系:
函数的 prototype: 定义函数时被自动赋值, 值默认为{}, 即用为原型对象。
实例对象的__proto__: 在创建实例对象时被自动添加, 并赋值为构造函数的 prototype 值。
原型对象即为当前实例对象的父对象。当您你访问实例对象的属性时,JavaScript 首先会检查它们是否直接存在于该对象上,如果不存在,则会 [[Prototype]] 中查找。它不仅仅在该对象上搜寻,还会搜寻该对象的原型,以及该对象的原型的原型,依次层层向上搜索,直到找到一个名字匹配的属性或到达原型链的末尾。
五个原型规则:
1.所有的引用类型(数组、对象、函数),都具有对象的特性,即可自由扩展属性(null 对象除外)。
2.所有的函数,都有一个 prototype 属性,属性值也是一个普通对象。
3.所有的引用类型 (数组、对象、函数),都有一个_proto_属性,属性值是一个普通对象。
4.所有的引用类型(数组、对象、函数),_proto_属性值指向它的构造函数的‘prototype’属性值。
5.当试图得到对象的某个属性时,如果这个对象本身没有这个属性,那么它会去它的_proto_(即它的构造函数的 prototype)中去寻找。
前面四个原则 ed 命令: //所有的引用类型 (数组、对象、函数),都有一个_proto_属性,属性值是一个普通对象 console.log(obj._proto_); console.log(arr._proto_); console.log(fn._proto_); //所有的函数,都有一个 prototype 属性,属性值也是一个普通对象 console.log(fn.prototype) //所有的引用类型(数组、对象、函数),_proto_属性值指向它的构造函数的‘prototype’属性值 console.log(obj._proto_===Object.prototype) 第五个原则相对复杂一些,我们先看一下代码:
function Student(name, age) {
this.name = name
this.age = age
this.class = "1"
return this //默认 return this
}
Student.prototype.alertName = function(){//在 prototype 上扩展一个函数
alert(this.name) } var wangerxiao= new Student(wangerxiao", 20)
wangerxiao.printName = function(){//扩展一个方法
console.log(this.name) } //测试,两个方法都能够正确执行 wangerxiao.printName() wangerxiao.alertName() 在上面的代码中,我们先是写了一个学生的构造函数,然后在这个构造函数的 prototype 上写了一个 alertName 的方法,再通过这个构造函数实例化一个学生王二小并为其扩展一个 printName 方法,当我们执行测试的代码的时候,第一行 wangerxiao.printName()很顺利地就能执行完毕,因为 wangerxiao 这个对象里有这样的一个方法,但是当执行 wangerxiao.alertName 的时候,
wangerxiao 这个对象并没有这个方法,那么按照原型的第五个原则,它回去wangerxiao 的构造函数中去找这个名为 alertName 的方法,找到了就会执行,而如果还找不到那么就会继续向上,去函数的构造函数上去寻找,一直溯源到null,如果都找不到就会报错。这个原理其实就能很好地体现出什么是原型链。
实例对象的__proto__指向构造函数的 prototype,从而实现继承。JavaScript 中的继承分为二种:
一、属性继承:
function Person (name, age) {
this.name = name
this.age = age }
// 方法定义在构造函数的原型上 Person.prototype.getName = function () { console.log(this.name)}
function Teacher (name, age, subject) {
Person.call(this, name, age)
this.subject = subject } 二、方法继承:
Teacher.prototype = Object.create(Person.prototype) Teacher.prototype.constructor = Teacher
JS 语言的魅力并不仅不局限于此,想要了解更多关于 JavaScript 的知识可以观看本站的 JavaScript 专题视频课程,为你筑梦成为一名前端大神!
https://www.wkcto.com/courses/javascript.html
相关热词搜索: 原型热门文章:
- 2024年度宣传思想和意识形态...2025-01-12
- 第四季度入党积极分子思想汇...2025-01-12
- 宣传思想文化工作总结及2024...2025-01-12
- 2024年第四季度入党积极分子...2025-01-11
- 第四季度入党积极分子思想汇...2025-01-11
- 2024年区农业农村局宣传思想...2025-01-10
- 县级领导主题教育专题党课:...2025-01-08
- 在全省人大代表履职平台建设...2025-01-08
- 在全市纪检监察信息化平台建...2025-01-08
- 2024年牛产业工作推进会上汇...2025-01-07
相关文章:
- 我应该美国还是中国进行原型...2021-09-28
- 产品经理原型工具2021-09-28
- 原型验证侦错设备招标2021-09-28
- 4.2模型或原型制作2021-09-28
- 《亲爱》原型——许尤2021-09-28
- 反求工程及原型制造课程要求2021-09-28
- 壮剧《螺丝姑娘》原型及民族特色2021-09-28
- 《模型或原型制作》教学设计2021-09-28
- “模型或原型制作”教学设计2021-09-28