热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

JavaScript中函数与构造函数的关系

JavaScript中函数与构造函数的关系-我们都知道,当一个函数被声明时它便拥有prototype属性,且此函数可作为构造函数调用,无论其函数体内有没有this,调用完成后,函数

我们都知道,当一个函数被声明时它便拥有prototype属性,且此函数可作为构造函数调用,无论其函数体内有没有this,调用完成后,函数的prototype属性将会赋值给新建对象的proto属性。

 function Person(name){
     this.name = name
 }
 ​
 function Animal(){}
 ​
 Person.hasOwnProperty('prototype') //true
 Animal.hasOwnProperty('prototype') //true
 ​
 let john = new Person('john')// It is Ok
 let pig = new Person('pig')// It is Ok,too

但是,上面只是一般的情况,以下有几种特例,函数无法作为构造函数被调用:

 class Person{
     static getName(){
         return 'john'
     }
 }
 ​
 class Animal{
     getName(){
         return 'pig'
     }
 }
 ​
 let pig = new Animal()
 ​
 Person.getName.prototype //undefined
 pig.getName.prototype //undefined
 let person = new Person.getName() //Type Error, because Person.getName is not a constructor
 let p = new pig.getName() //Type Error, because pig.getName is not a constructor

有上可知,类的静态函数和实例函数都没有prototype属性,也都无法进行实例化。我们可以猜想,是不是因为没有prototype属性,我们才无法进行实例化,所以我们尝试为静态函数添加prototype属性:

 class Person{
     static getName(){
         return 'john'
     }
 }
 ​
 let proto = {}
 proto.cOnstructor= Person.getName()
 ​
 Person.getName.prototype = proto
 ​
 new Person.getName() //still Error

从上面代码我们可以知道, 即使有了prototype属性,静态方法也无法作为构造函数实例化,因此我们尝试用另一种方法声明类的静态方法:

 class Person{
     static getName = function(){
         return 'john'
     }
 }
 ​
 Person.getName = hasOwnProperty('prototype') //true
 let person = new Person.getName()// It is Ok

从上面代码可知,当类静态函数通过赋值声明时,我们可以将其作为构造函数实例化,那是不是只要通过赋值声明的函数都可以实例化,我们进行进一步的验证:

 class Person{
     static getName = () => {return 'john'}
 }
 Person.getName = hasOwnProperty('prototype') //false
 let person = new Person.getName()// Error
 ​
 let Animal = () => {}
 Animal = hasOwnProperty('prototype') //false
 let animal = new Animal()// Error

我们可以进一步得知,当箭头函数赋值给静态函数时,静态函数无法作为构造函数实例化,且箭头函数单独使用时也无法进行实例化,因此我们可以得知函数实例化的关键是function关键字

总结

从上面的一步步验证我们可以知道,一个函数能否作为构造函数被实例化的关键在于函数的声明方式,而不是有无prototype属性或者函数的存在方式。只有使用function关键字声明的函数才是构造函数,反之,使用箭头函数或者ES6类函数简写声明的方式所声明的函数,都无法作为构造函数使用。


推荐阅读
  • 本文探讨了如何通过检测浏览器类型来动态加载特定的npm包,从而优化前端性能。具体而言,仅在用户使用Edge浏览器时加载相关包,以提升页面加载速度和整体用户体验。此外,文章还介绍了实现这一目标的技术细节和最佳实践,包括使用User-Agent字符串进行浏览器识别、条件加载策略以及性能监控方法。 ... [详细]
  • 我有一个包含多个URL的数组。首先,需要同步获取数组中的第一个和第二个URL,当其中任意一个请求完成时,再继续处理第三个URL。这种按序获取的方式可以确保数据的正确性和完整性,避免因并发请求导致的数据混乱。 ... [详细]
  • 本文探讨了如何在 Google Sheets 中通过自定义函数实现 AJAX 调用。具体介绍了编写脚本的方法,以便在电子表格中发起 AJAX 请求,从而实现数据的动态获取与更新。这种方法不仅简化了数据处理流程,还提高了工作效率。 ... [详细]
  • 在《JavaScript进阶之旅:第三阶段深入探索》中,我们将通过一系列复杂的代码示例,深入探讨JavaScript的高级特性与应用技巧。本阶段将重点讲解如何利用用户输入进行动态交互,例如通过提示框获取1到9之间的正整数,并基于此实现更多功能。此外,还将介绍如何优化代码结构,提升程序的可读性和维护性。 ... [详细]
  • 本文旨在构建一个JavaScript函数,用于对用户输入的电子邮件地址和密码进行有效性验证。该函数将确保输入符合标准格式,并检查密码强度,以提升用户账户的安全性。通过集成正则表达式和条件判断语句,该方法能够有效防止常见的输入错误,同时提供即时反馈,改善用户体验。 ... [详细]
  • functionCheckAvailableScope(){$(input[namechkXZSYY]).each(function( ... [详细]
  • 如何高效地压缩JavaScript代码以提升网页性能
    本篇内容介绍了“javascript如何压缩”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处 ... [详细]
  • 本文探讨了Android系统中联系人数据库的设计,特别是AbstractContactsProvider类的作用与实现。文章提供了对源代码的详细分析,并解释了该类如何支持跨数据库操作及事务处理。源代码可从官方Android网站下载。 ... [详细]
  • Web开发实践:创建连连看小游戏
    本文详细介绍了如何在Web环境中开发一款连连看小游戏,适合初学者和技术爱好者参考。通过本文,您将了解游戏的基本结构、连线算法以及实现方法。 ... [详细]
  • 使用 Babylon.js 实现地球模型与切片地图交互(第三部分)
    本文继续探讨在上一章节中构建的地球模型基础上,如何通过自定义的 `CameraEarthWheelControl` 类来实现更精细的地图缩放控制。我们将深入解析该类的实现细节,并展示其在实际项目中的应用。 ... [详细]
  • 使用jQuery与百度地图API实现地址转经纬度功能
    本文详细介绍了如何利用jQuery和百度地图API将地址转换为经纬度,包括申请API密钥、页面构建及核心代码实现。 ... [详细]
  • 我在尝试将组合框转换为具有自动完成功能时遇到了一个问题,即页面上的列表框也被转换成了自动完成下拉框,而不是保持原有的多选列表框形式。 ... [详细]
  • 本文介绍了如何通过安装和配置php_uploadprogress扩展来实现文件上传时的进度条显示功能。通过一个简单的示例,详细解释了从安装扩展到编写具体代码的全过程。 ... [详细]
  • 本文详细介绍如何在SSM(Spring + Spring MVC + MyBatis)框架中实现分页功能。包括分页的基本概念、数据准备、前端分页栏的设计与实现、后端分页逻辑的编写以及最终的测试步骤。 ... [详细]
  • 在 Angular Google Maps 中实现图片嵌入信息窗口的功能,可以通过使用 `@agm/core` 库来实现。该库提供了丰富的 API 和组件,使得开发者可以轻松地在地图上的信息窗口中嵌入图片。本文将详细介绍如何配置和使用这些组件,以实现动态加载和显示图片的功能。此外,还将探讨一些常见的问题和解决方案,帮助开发者更好地集成这一功能。 ... [详细]
author-avatar
cometcui
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有