js构造函数(原型链)及Es6的class类
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构造函数过程:
- new 申请内存(在内存中创建一个空对象)
- this指向创建的新对象
- 执行函数内部的代码,给空对象添加属性和方法
- 返回这个空对象
当调用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类相关推荐
- JS基于原型链的继承和基于类的继承学习总结
1. new关键字创建一个对象的过程 (1) 创建一个空的简单对象(即{}) (2)为步骤1新创建的对象添加属性_proto_,该属性连接至构造函数的原型对象 (3)将步骤1新创建的对象作为this的 ...
- 怎么理解js的原型链继承?
前言 了解java等面向对象语言的童鞋应该知道.面向对象的三大特性就是:封装,继承,多态. 今天,我们就来聊一聊继承.但是,注意,我们现在说的是js的继承. 在js的es6语法出来之前,我们想实现js ...
- 构造函数 + 原型链继承 + 临摹面向对象模式的canvas动画框架
感谢谢帅shawn分享的canvas动画框架,我再来分一次 //动画框架 http://neekey.net/blog/2011/05/11/canvas-%E7%AE%80%E5%8D%95%E5% ...
- js的原型链简单理解
js的原型链 首先,在将js的原型链之前我们先来说一下什么是原型,当我们生成一个普通对象x的时候,这个x会有一个隐藏属性x._proto_,这个属性会指向Object.prototype也就是 x._ ...
- ES6/02/创建对象,构造函数和原型,原型和原型链,this指向,类,ES5新增的方法,数组方法,回调函数,ES5新增的字符串方法,ES5中新增的对象方法
创建对象 1,利用new Object()创建对象 var obj1 =new Object(); 2,利用对象字面量创建对象 var obj2={}; 3,利用构造函数创建对象 function S ...
- JS数据类型 构造函数 原型链
js数据类型 基本数据类型:string undefined null boolean number 引用数据类型 Object array function 二者的区别 基本数据类 ...
- JS高级---原型链(一看就懂,但18岁以下请绕道)
1)小明是小明妈生的,小狗是小狗妈生的.小明和小狗都是对象实例,而小明妈和小狗妈就是原型.原型也是对象,叫原型对象. 2)小明妈和小明爸啪啪啪能生出一堆小明明.小狗妈和小狗爸啪啪啪能生出一堆小狗狗,啪 ...
- 一文带你领略JS中原型链的精妙设计!
对于很多前端初学者来说,JavaScript中的原型链理解是一个很难的过程,有工作了好几年还无法理解原型链设计的大有人在,今天小千就来通过例子给大家介绍这个js原型链. 我们想要理解原型链,首先我们先 ...
- 一文带你领略JS中原型链的精妙设计
对于很多前端初学者来说,JavaScript中的原型链理解是一个很难的过程,有工作了好几年还无法理解原型链设计的大有人在,今天小千就来通过例子给大家介绍这个js原型链. 我们想要理解原型链,首先我们先 ...
最新文章
- 无线红外探测器03-环境搭建及程序详解
- java基础学习(2)-java基本数据类型
- 2021第六届数维杯大学生数学建模竞赛赛题_A 外卖骑手的送餐危机
- VMware VDI技术与实现
- caffe训练中断后如何承接上次继续训练
- 史上最神奇的公式,竟然藏着这么多秘密!
- php判断是否是关联数组,php 关联数组判断是否为空
- 【DP】奇怪汉诺塔(ybtoj DP-1-2)
- day13 迭代器和生成器
- ac2100 反弹shell无法粘贴_记一次突破反弹shell
- mysql主从搭建配置(mysql version5.7.22)
- 指南 | Pytorch定义网络的几种方法
- centos 6.5卸载Mysql
- 【python VS Code】调用自定义模块 ModuleNotFoundError: No module named XXX
- mysql字段里面有16字节特殊字符替换
- 开源H5棋牌 cocos creator微信棋牌小游戏 幼麟棋牌服务端分析笔记
- PS视频教程|photoshop视频教程零基础入门到精通
- 小程序源码:王者荣耀吃鸡气泡等等头像框DIY在线生成N种风格-多玩法安装简单
- 手机加上芯片可看免费电视 明年国内将上市(图)
- 高考数学考用计算机求函数吗,高考数学52种快速做题方法整理!再也不用担心考试时间不够了...
热门文章
- ASM磁盘介绍及PIGOSS BSM支持ASM磁盘监控
- 人工智能改变人力资源的11种方式
- 基于 MySQL Binlog 的 Elasticsearch 数据同步实践 原
- libreoffice linux命令行,linux下使用libreoffice 命令行转化进行excel转PDF的排版问题
- win10分辨率不能调整_笔记本电脑如何连接投影仪?MAC OS/Win10/7笔记本和投影仪连接方法...
- python 截取视频片段
- JS - 自由变量与作用域链
- LeetCode-55、跳跃游戏-中等
- PBOC/EMV之文件结构
- 什么是闭包,闭包的作用与好处是什么,何时使用闭包,对闭包的改进