js函数

首先弄明白何为函数呢,函数简单的说就是重复执行的代码块。函数是这样的一段JavaScript 代码,它只定义一次,但可能被执行或调用任意次。

函数的定义方式:

1.声明式函数定义: function fuc (){};这种定义方式,会将函数声明提升到该函数所在作用域的最开头,只在这个作用域内,你都可以调用这个函数。
2.函数表达式:let fuc = function(){}; 此方式定义的函数,只能在该作用域中,这段赋值代码执行之后才能通过fun()调用函数,否则,由于变量声明提升,fuc === undefined。
3.new Function(构造函数) 形式: var fuc = new Function (arg1 , arg2 ,arg3 ,…, argN , body );Function构造函数所有的参数都是字符串类型,都作为生成函数的参数即形参。除了最后一个参数, 最后一个参数, 表示的fnc函数的“函数体”。

var add = new Function('x','y','return x + y' //函数体
);
// 等同于
function add(x, y) {return x + y;
}

总结:1 、第一种和第二种函数的定义的方式其实是第三种new Function 的语法糖,当我们定义函数时候都会通过 new Function 来创建一个函数,只是前两种为我们进行了封装,我们看不见了而已,js 中任意函数都是Function 的实例。2、ECMAScript 定义的 函数实际上是功能完整的对象。

二、构造函数

定义:通过 new 函数名 来实例化对象的函数叫构造函数。任何的函数都可以作为构造函数存在。
  之所以有构造函数与普通函数之分,主要从功能上进行区别的,构造函数的主要 功能为 初始化对象,特点是和new 一起使用。
  new就是在创建对象,从无到有,构造函数就是在为初始化的对象添加属性和方法。构造函数定义时首字母大写(规范)。

new构造函数过程:

  1. new 申请内存(在内存中创建一个空对象)
  2. this指向创建的新对象
  3. 执行函数内部的代码,给空对象添加属性和方法
  4. 返回这个空对象

当调用new时,后台会隐式执行new Object()创建对象。所以,通过new创建的字符串、数字是引用类型,而是非值类型。

1、常用的构造函数:

  • var arr = []; 为 var arr = new Array(); 的语法糖。
  • ar obj = {} 为 var obj = new Object(); 的语法糖
  • var date = new Date();

2、执行构造函数时发生的事 :

function Foo(name,age,sex){this.name = name;this.age = age;this.sex = sex;
}
Foo.prototype.belief = function(){console.log('信仰!');
}
let f = new Foo ('zh',18,'男');

a . let f = {}; //一个继承自 Foo.prototype 的新对象被创建。
b. f.proto = Foo.prototype; // f 继承 Foo的原型。
b Foo.call(f,‘zh’,18,‘男’); //执行Foo函数,将name,age,sex 参数传入Foo中执行,此时函数内部this 为 new 创建的 f对象,所以 f.name = ‘zh’;f.age = 18; f.sex = ‘男’;
c. 实例化对象完成,此时
f = {
 name:‘zh’,
 age:18,
}
d. f.belief(); 打印

手写new函数

function newTest (constructFunction){let obj = {};obj.__proto__ = constructFunction.prototype;return function(){constructFunction.apply(obj,arguments);return obj;}
}

注意:当构造函数中有返回对象时候,最终new出来的对象会是构造函数的返回值,而不是new过程中生成的对象。仅当构造函数返回值是对象时有效,当不是对象时依旧返回new过程中形成的对象(无论如何new 构造函数之后都会返回一个对象值)。
原型链:

1、所有的引用类型(数组、函数、对象)可以自由扩展属性(除null以外)。

2、所有的引用类型都有一个_ _ proto_ _属性(也叫隐式原型,它是一个普通的对象)。

3、所有的函数都有一个prototype属性(这也叫显式原型,它也是一个普通的对象)。

4、所有引用类型,它的_ _ proto_ _属性指向它的构造函数的’prototype’属性。

5、当试图得到一个对象的属性时,如果这个对象本身不存在这个属性,那么就会去它的_ _ proto_ _属性(也就是它的构造函数的’prototype’属性)中去寻找。

三、ES6 中 class 与构造函数的关系

class 为 构造函数的语法糖,即 class 的本质是 构造函数。class的继承 extends 本质 为构造函数的原型链的继承。

例如:
类的写法

class Person{  //定义一个名字为Person的类constructor(name,age){ //constructor是一个构造方法,用来接收参数this.name = name;  //this代表实例对象this.age = age;} say(){  //这是一个类的方法,注意千万不要加上functionreturn   this.name + this.age}
}
var obj = new Person('老铁',18);
console.log(obj.say());

构造函数的写法

function Person(name,age){if(!(this instanceof Person)){ //避免使用者不小心讲Person当作普通函数执行throw new Error(''请使用 new Person"); //仿ES6 class 中的写法}this.name = name;this.age = age;
}
Person.prototype.say = function(){return   this.name + this.age
}  
var obj = new Person('老铁',18);   //通过构造函数创建对象,必须使用new运算符
console.log(obj.say());

总结:通过class定义的类 和通过构造函数定义的类 二者本质相同。并且在js执行时,会将第一种转会为第二种执行。所以 ES6 class的写法实质就是构造函数。

js构造函数(原型链)及Es6的class类相关推荐

  1. JS基于原型链的继承和基于类的继承学习总结

    1. new关键字创建一个对象的过程 (1) 创建一个空的简单对象(即{}) (2)为步骤1新创建的对象添加属性_proto_,该属性连接至构造函数的原型对象 (3)将步骤1新创建的对象作为this的 ...

  2. 怎么理解js的原型链继承?

    前言 了解java等面向对象语言的童鞋应该知道.面向对象的三大特性就是:封装,继承,多态. 今天,我们就来聊一聊继承.但是,注意,我们现在说的是js的继承. 在js的es6语法出来之前,我们想实现js ...

  3. 构造函数 + 原型链继承 + 临摹面向对象模式的canvas动画框架

    感谢谢帅shawn分享的canvas动画框架,我再来分一次 //动画框架 http://neekey.net/blog/2011/05/11/canvas-%E7%AE%80%E5%8D%95%E5% ...

  4. js的原型链简单理解

    js的原型链 首先,在将js的原型链之前我们先来说一下什么是原型,当我们生成一个普通对象x的时候,这个x会有一个隐藏属性x._proto_,这个属性会指向Object.prototype也就是 x._ ...

  5. ES6/02/创建对象,构造函数和原型,原型和原型链,this指向,类,ES5新增的方法,数组方法,回调函数,ES5新增的字符串方法,ES5中新增的对象方法

    创建对象 1,利用new Object()创建对象 var obj1 =new Object(); 2,利用对象字面量创建对象 var obj2={}; 3,利用构造函数创建对象 function S ...

  6. JS数据类型 构造函数 原型链

    js数据类型 基本数据类型:string   undefined   null  boolean  number 引用数据类型  Object  array  function 二者的区别 基本数据类 ...

  7. JS高级---原型链(一看就懂,但18岁以下请绕道)

    1)小明是小明妈生的,小狗是小狗妈生的.小明和小狗都是对象实例,而小明妈和小狗妈就是原型.原型也是对象,叫原型对象. 2)小明妈和小明爸啪啪啪能生出一堆小明明.小狗妈和小狗爸啪啪啪能生出一堆小狗狗,啪 ...

  8. 一文带你领略JS中原型链的精妙设计!

    对于很多前端初学者来说,JavaScript中的原型链理解是一个很难的过程,有工作了好几年还无法理解原型链设计的大有人在,今天小千就来通过例子给大家介绍这个js原型链. 我们想要理解原型链,首先我们先 ...

  9. 一文带你领略JS中原型链的精妙设计

    对于很多前端初学者来说,JavaScript中的原型链理解是一个很难的过程,有工作了好几年还无法理解原型链设计的大有人在,今天小千就来通过例子给大家介绍这个js原型链. 我们想要理解原型链,首先我们先 ...

最新文章

  1. 无线红外探测器03-环境搭建及程序详解
  2. java基础学习(2)-java基本数据类型
  3. 2021第六届数维杯大学生数学建模竞赛赛题_A 外卖骑手的送餐危机
  4. VMware VDI技术与实现
  5. caffe训练中断后如何承接上次继续训练
  6. 史上最神奇的公式,竟然藏着这么多秘密!
  7. php判断是否是关联数组,php 关联数组判断是否为空
  8. 【DP】奇怪汉诺塔(ybtoj DP-1-2)
  9. day13 迭代器和生成器
  10. ac2100 反弹shell无法粘贴_记一次突破反弹shell
  11. mysql主从搭建配置(mysql version5.7.22)
  12. 指南 | Pytorch定义网络的几种方法
  13. centos 6.5卸载Mysql
  14. 【python VS Code】调用自定义模块 ModuleNotFoundError: No module named XXX
  15. mysql字段里面有16字节特殊字符替换
  16. 开源H5棋牌 cocos creator微信棋牌小游戏 幼麟棋牌服务端分析笔记
  17. PS视频教程|photoshop视频教程零基础入门到精通
  18. 小程序源码:王者荣耀吃鸡气泡等等头像框DIY在线生成N种风格-多玩法安装简单
  19. 手机加上芯片可看免费电视 明年国内将上市(图)
  20. 高考数学考用计算机求函数吗,高考数学52种快速做题方法整理!再也不用担心考试时间不够了...

热门文章

  1. ASM磁盘介绍及PIGOSS BSM支持ASM磁盘监控
  2. 人工智能改变人力资源的11种方式
  3. 基于 MySQL Binlog 的 Elasticsearch 数据同步实践 原
  4. libreoffice linux命令行,linux下使用libreoffice 命令行转化进行excel转PDF的排版问题
  5. win10分辨率不能调整_笔记本电脑如何连接投影仪?MAC OS/Win10/7笔记本和投影仪连接方法...
  6. python 截取视频片段
  7. JS - 自由变量与作用域链
  8. LeetCode-55、跳跃游戏-中等
  9. PBOC/EMV之文件结构
  10. 什么是闭包,闭包的作用与好处是什么,何时使用闭包,对闭包的改进