iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >JavaScript原型Prototype怎么使用
  • 603
分享到

JavaScript原型Prototype怎么使用

2023-06-21 22:06:43 603人浏览 八月长安
摘要

这篇文章主要讲解了“javascript原型Prototype怎么使用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“JavaScript原型Prototype怎么使用”吧!1、概述1.1原型

这篇文章主要讲解了“javascript原型Prototype怎么使用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“JavaScript原型Prototype怎么使用”吧!

    1、概述

    1.1原型是什么

    JavaScript中,函数是一个包含属性和方法的Function类型的对象。而原型(Prototype )就是Function类型对象的一个属性。

    在函数定义是包含了prototype属性,它的初始值是一个空对象 。在JavaScript中并没有定义函数的原始类型,所以原型可以是任何类型。

    原型是用于保存对象的共享属性和方法的,原型的属性和方法并不会影响函数本身的属性和方法。

    示例代码验证如下:

    function fun() {  console.log('函数原型')}console.log(fun.prototype) // {}

    fun.prototype返回的也是一个空对象,但是这不说明Object.prototype中没有属性或者方法,这些属性和方法为不可枚举的,示例代码如下所示:

    function fun() {  console.log('函数原型')}console.log(fun.prototype) // {}// 通过 Object.getOwnPropertyNames() 获取全部属性console.log(Object.getOwnPropertyNames(fun.prototype)) // [ 'constructor' ]

    其中,constructor属性指向该构造函数的引用,代码如下:

    // constructor属性console.log(fun.prototype.constructor) // [Function: fun]console.log(fun.prototype.constructor === fun) // true

    1.2获取原型

    了解了原型的概念以及作用之后,我们需要获取到原型才能对其进行操作,在JavaScript中获取原型的方式有两种,如下所示:

    通过构造函数的prototype属性。

    通过Object.getPrototypeOf(obj)方法。

    这两个的区别就是构造函数的prototype属性一般只配合构造函数使用,而Object.getPrototypeOf(obj)方法一般是获取构造函数实例化后的对象的原型方法。

    实例代码如下:

    // 构造函数function Person(name) {  this.name = name}// 指向构造函数的原型var p1 = Person.prototypevar person = new Person('一碗周')// 指向构造函数的原型var p2 = Object.getPrototypeOf(person)console.log(p1 === p2) // true

    获取原型后可以跟操作对象似的进行操作,因为原型本身就是一个对象。

    2、原型属性

    JavaScript中,函数本身也是一个包含了方法和属性的对象。接下将学习函数对象的另一个属性——prototype,这个属性的初始值是一个空对象。

    2.1利用原型添加属性与方法。

    为对象添加属性和方法的另一种用法就是通过原型为其添加。当为一个构造函数添加原型属性和原型方法时,通过该构造函数new出的所有对象共享该属性和方法。

    PS:所谓的原型属性或者原型方法就是通过原型添加的属性或者方法。

    添加属性和方法的方式具有如下几种方式

    直接为其增加属性或者方法

    通过Object.defineProperty()方法,添加属性或者方法。这种方式比第一种方式更具有安全性。

    直接添加对象到原型。

    示例代码如下所示:

    //构造函数function Fun() {}//直接为构造函数添加属性和方法Fun.prototype.str = '这是一个字符串'Fun.prototype.fn = function () {  console.log('这是一个方法')}//通过 defineProperty 添加属性或者方法Object.defineProperty(Fun.prototype, 'MyFun', {  value: function () {    console.log('this is MyFun')  },})//测试console.log(Fun.prototype.str)Fun.prototype.fn()Fun.prototype.MyFun()var fun = new Fun()fun.MyFun()//直接为其定义个对象覆盖到之前的原型上Fun.prototype = {  name: '一碗周',  fun: function () {    console.log('this is function')  },}Fun.prototype.fun()var fun = new Fun()fun.fun()

    2.2访问原型属性原型方法

    对于原型来说,最重要的一点就是它的实时性 。由于在JavaScript中,几乎所有的对象都是通过传引用的方式来传递的,因此我们所创建的的每个新对象实体中并没有一份属于自己的原型副本。这就意味着我们随时修改prototype属性,并且由同一构造器创建的所有对象的prototype属性也都会同时改变,包括我们之间通过构造器创建的属性和方法。

    还是上面那段代码我们向原型中添加一个新方法,并调用,示例代码如下所示:

    Fun.prototype.fn = function () {  console.log('这是一个方法')}fun.fn() //这是一个方法

    我们之前创建的对象可以访问新加的原型属性和原型方法。

    3、自有属性与原型属性

    我们先来创建一个构造函数,并为其添加两个原型属性。

    //构造函数function Fun() {}//添加原型属性和方法Fun.prototype.name = '一碗粥'Fun.prototype.print = function () {  console.log('this is function')}

    在通过该构造函数创建一个对象,为其设置属性和方法

    //通过构造函数创建对象var fun = new Fun()//为对象添加属性和方法fun.name = '一碗周'fun.SayMe = function () {  console.log('this is SayMe')}

    现在我们的fun对象,拥有自有属性/方法两个,原型属性/方法两个。我们依次来访问这些属性和方法。

    //访问属性和方法console.log(fun.name) // 一碗周fun.SayMe() // this is SayMefun.print() // this is function

    当我们访问name属性时,JavaScript引擎会遍历fun这个对象的所有属性,并返回name属性的值。SayMe()方法也是样的道理。但是到print()方法时,JavaScript引擎还是会遍历这个对象所有属性,这时就找不到一个叫print()方法了,接下来JavaScript引擎就会访问创建当前对象的构造器函数的原型,也就是我们的Fun.prototype,如果其中有该属性,则立即返回,否则返回undefined或者抛出异常

    结论:当有自有属性时,优先访问自有属性,访问完自有属性再去访问原型属性 。

    3.1检测自有属性或者原型属性

    现在已经知道自有属性和原型属性的概念以及用途了,但是我们怎么知道一个属性时自由属性还是原有属性,JavaScript中提供以下两种方式来检测一个属性的情况

    使用Object.prototype.hasOwnProperty(prop)方法来检测prop属性是否是自由属性,该方法返回一个布尔值,如果是自有属性则返回true,否则返回false。

    来使用in关键字来检测对象以及原型链中是否具有指定属性。

    测试代码如下:

    // 通过Object.prototype.hasOwnProperty(prop)方法检测是否为自有属性console.log(fun.hasOwnProperty('name')) // trueconsole.log(fun.hasOwnProperty('print')) // false// 如果一个不存在的属性检测结果也是为falseconsole.log(fun.hasOwnProperty('SayMe')) // true// 通过 in 运算符console.log('name' in fun) // trueconsole.log('print' in fun) // trueconsole.log('SayMe' in fun) // true

    通过测试我们发现,这两个方法并不能检测一个属性是不是一个自有属性或者原型属性,但是将这两个方法结合起来就可以检测是自有属性还是原型属性了,

    示例代码如下:

    function DetectionAttributes(obj, attr) {  if (attr in obj) {    if (obj.hasOwnProperty(attr)) {      // 如果是自有属性属性返回1      return 1    } else {      // 如果是原型属性返回0      return 0    }  } else {    // 没有这个属性返回 -1    return -1  }}

    测试如下:

    console.log(DetectionAttributes(fun, 'name')) // 1
    console.log(DetectionAttributes(fun, 'print')) // 0
    console.log(DetectionAttributes(fun, 'SayMe')) // 1

    4、isPrototypeOf()方法

    isPrototypeOf()方法用来检测一个对象是否存在于另一个对象的原型链中,如果存在就返回true,否则就返回false。

    实例代码如下所示:

    // 定义一个对象,用于赋值给原型对象var obj = function () {  this.name = '一碗周'}var Hero = function () {} // 定义构造函数// 将定义的对象赋值给构造函数的原型Hero.prototype = obj// 通过Hero创建对象var hero1 = new Hero()var hero2 = new Hero()// 判断创建的两个对象是否在 obj 的原型链中console.log(obj.isPrototypeOf(hero1)) // trueconsole.log(obj.isPrototypeOf(hero2)) // true

    5、扩展内置对象

    JavaScript中的内置对象有些也具prototype属性,利用内置对象的prototype属性可以为内置对象扩展属性和方法。

    通过原型扩展内置对象的属性和方法非常灵活,根据个性化要求制定JavaScript语言的具体内容。

    扩展内置对象的方式有两种,具体如下所示:

    通过直接新增属性和方法。

    通过Object对象的defineProperty()方法为其新增属性或者方法。这种方式会比第一种方式要好,是创建的属性和方法更具有安全性

    示例代码如下所示:

    // 为 Object 扩展属性和方法// 使用第一种方式Object.prototype.MyPrint = function () {  console.log('this is MyPrint()')}// 使用第二种方式Object.defineProperty(Object.prototype, 'MyInput', {  value: function () {    console.log('this is MyInput()')  },})// 调用Object.prototype.MyPrint() // this is MyPrint()Object.prototype.MyInput() // this is MyInput()

    感谢各位的阅读,以上就是“JavaScript原型Prototype怎么使用”的内容了,经过本文的学习后,相信大家对JavaScript原型Prototype怎么使用这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是编程网,小编将为大家推送更多相关知识点的文章,欢迎关注!

    --结束END--

    本文标题: JavaScript原型Prototype怎么使用

    本文链接: https://www.lsjlt.com/news/301007.html(转载时请注明来源链接)

    有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

    本篇文章演示代码以及资料文档资料下载

    下载Word文档到电脑,方便收藏和打印~

    下载Word文档
    猜你喜欢
    • JavaScript原型Prototype怎么使用
      这篇文章主要讲解了“JavaScript原型Prototype怎么使用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“JavaScript原型Prototype怎么使用”吧!1、概述1.1原型...
      99+
      2023-06-21
    • JavaScript原型Prototype详情
      目录1、概述 1.1原型是什么 1.2获取原型 2、原型属性 2.1利用原型添加属性与方法。 2.2访问原型属性原型方法 3、自有属性与原型属性 3.1检测自有属性或者原型属性 4、...
      99+
      2024-04-02
    • 怎么使用Javascript的prototype链
      这篇文章主要介绍“怎么使用Javascript的prototype链”,在日常操作中,相信很多人在怎么使用Javascript的prototype链问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么使用Jav...
      99+
      2023-06-17
    • Prototype原型模式怎么实现
      本篇内容介绍了“Prototype原型模式怎么实现”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成! Pro...
      99+
      2024-04-02
    • JavaScript函数及prototype怎么使用
      这篇文章主要介绍“JavaScript函数及prototype怎么使用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“JavaScript函数及prototype怎么使用”文章能帮助大家解决问题。一、...
      99+
      2023-07-05
    • PHP原型模式Prototype Pattern如何使用
      本文小编为大家详细介绍“PHP原型模式Prototype Pattern如何使用”,内容详细,步骤清晰,细节处理妥当,希望这篇“PHP原型模式Prototype Pattern如何使用”文章能帮助大家解决疑惑,下面跟着小...
      99+
      2023-07-05
    • 什么是Prototype原型模式
      本篇内容介绍了“什么是Prototype原型模式”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!前言在设计模...
      99+
      2024-04-02
    • JS中prototype怎么使用
      在 JavaScript 中,每个对象都有一个 `prototype` 属性,可以通过 `Object.prototype` 来访问...
      99+
      2023-08-18
      JS prototype
    • JavaScript原型对象怎么用
      这篇文章主要介绍“JavaScript原型对象怎么用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“JavaScript原型对象怎么用”文章能帮助大家解决问题。你理解...
      99+
      2024-04-02
    • 一文详解JavaScript中prototype的使用
      目录prototype初步认识函数有prototype属性,函数创建的对象没有获得当前对象的属性父和子的扩展子的proto和prototype的区别扩展得到的东西到底从哪来的prot...
      99+
      2024-04-02
    • javascript中prototype方法有什么用
      这篇文章主要为大家展示了“javascript中prototype方法有什么用”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“javascript中prototy...
      99+
      2024-04-02
    • JavaScript Boolean prototype属性有什么用
      JavaScript中的Boolean构造函数有一个名为prototype的属性,它是一个对象,它允许您向Boolean对象添加新的...
      99+
      2023-10-11
      JavaScript
    • JavaScript Date prototype属性有什么用
      JavaScript 中的 Date 对象是用于处理日期和时间的对象。 Date 对象有很多方法和属性可以进行日期和时间的操作。其中...
      99+
      2023-10-12
      JavaScript
    • Javascript中怎么实现原型和原型链
      今天就跟大家聊聊有关Javascript中怎么实现原型和原型链,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。原型Javascript中有一句话,叫一...
      99+
      2024-04-02
    • js中使用原型对象prototype需要注意的地方有哪些
      这篇文章主要为大家展示了“js中使用原型对象prototype需要注意的地方有哪些”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“js中使用原型对象prototy...
      99+
      2024-04-02
    • javascript原型链的使用方式
      这篇文章主要讲解了“javascript原型链的使用方式”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“javascript原型链的使用方式”吧!说明原型中包含的引用值将在所有实例之间共享。因...
      99+
      2023-06-20
    • JavaScript原型与原型链深入探究使用方法
      目录原型(prototype)显示原型与隐式原型原型链原型链属性问题原型链 instanceof 使用练习原型(prototype) 每一个函数都有一个 prototype 属性,它...
      99+
      2022-11-13
      JavaScript原型链 JavaScript原型 JS原型与原型链
    • JavaScript中的原型和原型链怎么理解
      这篇文章主要介绍“JavaScript中的原型和原型链怎么理解”,在日常操作中,相信很多人在JavaScript中的原型和原型链怎么理解问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大...
      99+
      2024-04-02
    • JavaScript原型链怎么理解
      本篇内容介绍了“JavaScript原型链怎么理解”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1.原型的关系在JavaScript中的每个...
      99+
      2023-06-21
    • javascript原型链怎么实现
      这篇文章主要讲解了“javascript原型链怎么实现”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“javascript原型链怎么实现”吧!原型链在ES6中引入了class关键字,但是JS依...
      99+
      2023-06-22
    软考高级职称资格查询
    编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
    • 官方手机版

    • 微信公众号

    • 商务合作