飞扬范文网
当前位置 首页 >思想汇报 >

原型

发布时间:2021-09-28 14:56:05 浏览数:

 原型、原型链及原型继承

 在我们了解的一些典型的面向对象语言中,都存在着类的概念,类就是对象的模板,对象就是类的实例。但在 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

相关热词搜索: 原型