原生JS封装_new函数实现new关键字的功能
一.前言
众所周知:没有对象怎么办?那就new一个!
那么在JS中,当我们new一个对象的时候,这个new关键字内部都干了什么呢?
现在我们就来剖析一下原生JS中new关键字内部的工作原理。
二.原始的new
首先,我们先new一个对象看看:
//创建Person构造函数,参数为name,age function Person(name,age){ this.name = name; this.age = age; } //实例化对象小明 xm = new Person('xiaoming',18); //打印实例化出来的对象小明 console.log(xm);
打印结果:
从打印结果中可以看到:
用new关键字实例化对象时,首先创建了一个空对象xm,并且这个空对象包含两个属性name和age,分别对应构造函数中的两个属性,其次我们也可以知道实例化出来的这个对象xm是继承自Person.prototype,那么现在我们就可以总结出new关键字在实例化对象时内部都干了什么,其实,new关键字内部干了如下三件事(已知构造函数为Func):
1.创建一个空对象,并使该空对象继承Func.prototype;
2.执行构造函数,并将this指向刚刚创建的新对象;
3.返回新对象;
三.封装_new函数
当我们知道new关键字的内部原理后,我们就可以封装一个_new函数,使其用于与new关键字同样的功能。
_new函数需要传入以下几个参数:
第一个参数:构造函数名Func;
第二个参数及后面的参数:构造函数的参数
function _new(){ //1.拿到传入的参数中的第一个参数,即构造函数名Func var Func = [].shift.call(arguments); //2.创建一个空对象obj,并让其继承Func.prototype var obj = Object.create(Func.prototype); //3.执行构造函数,并将this指向创建的空对象obj Func.apply(obj,arguments) //4.返回创建的对象obj return obj }
四.测试_new函数
封装好后,我们来测试一下封装的_new函数,看看它是否实现了和原生new关键字同样的功能。
//创建Person构造函数,参数为name,age function Person(name,age){ this.name = name; this.age = age; } function _new(){ //1.拿到传入的参数中的第一个参数,即构造函数名Func var Func = [].shift.call(arguments); //2.创建一个空对象obj,并让其继承Func.prototype var obj = Object.create(Func.prototype); //3.执行构造函数,并将this指向创建的空对象obj Func.apply(obj,arguments) //4.返回创建的对象obj return obj } xm = _new(Person,'xiaoming',18); console.log(xm);
测试结果:
从测试结果看到,_new函数的功能与new关键字完全一致。
总结
以上所述是小编给大家介绍的原生JS封装_new函数实现new关键字的功能,希望对大家有所帮助,如果大家有任何疑问欢迎给我留言,小编会及时回复大家的!
相关推荐
-
详解Javascript中new()到底做了些什么?
前言 和其他高级语言一样 javascript 中也有 new 运算符,我们知道 new 运算符是用来实例化一个类,从而在内存中分配一个实例对象. 但在 javascript 中,万物皆对象,为什么还要通过 new 来产生对象? 本文将带你一起来探索 javascript 中 new 的奥秘... 要创建 Person 的新实例,必须使用 new 操作符. 以这种方式调用构造函数实际上会经历以下 4个步骤: (1) 创建一个新对象: (2) 将构造函数的作用域赋给新对象(因此 this 就指向了
-
用Newtonsoft将json串转为对象的方法(详解)
首先,将json串转为一个JObject对象: JObject jo = (JObject)JsonConvert.DeserializeObject(CurrentSelectedItemReq); 这个JObject是一个"值对"类型,比如说我们的json串是这样: { "rows":[ [ {"NumIid":"001"}, {"PicUrl":"xxx.png"}, {"
-
JS中使用new Option()实现时间联动效果
1.基础准备: 先来了解下,如何运用js实现select动态添加option. //1.动态创建select function createSelect(){ var mySelect = document.createElement("select"); mySelect.id = "mySelect"; document.body.appendChild(mySelect); } //2.添加选项option function addOption(){ //根据
-
JavaScript中new运算符的实现过程解析
这篇文章主要介绍了JavaScript中new运算符的实现过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 废话不多说直接进入正题,首先我们需要先知道new运算符到底做了哪些事情,再来模拟它实现这一功能. 1. 建立一个空的Object对象: 2. 把这个空对象用__proto__链接到原型 3. 用apply绑定对象的this指向 4. 返回新的对象 知道了new的具体过程之后,我们就可以来试一下用代码实现这一过程. // 传参 New
-
JavaScript new对象的四个过程实例浅析
本文实例讲述了JavaScript new对象的四个过程.分享给大家供大家参考,具体如下: new对象: function Person(name, age) { this.name = name; this.age = age; } var person = new Person("Alice", 23); new一个对象的四个过程: 1.创建一个空对象 var obj = new Object(); 2.让Person中的this指向obj,并执行Person的函数体 var re
-
javascript中new Array()和var arr=[]用法区别
大家在学习javascript中对于数组函数new Array()和var arr=[]很多朋友不知道如何区别,也不知道用法,下面看看我们总结的. var arr=[] 这是一种字面量定义数组的方法 var arr=new Array() 这是调用数组构造函数生成的数组 上面的2种定义数组的方法到底一样不一样 目前我们大致的认同是下面这样的 用new 关键字去内存开辟一个存储地址比较耗资源,耗内存. 而字面量方式直接在内存开辟一个存储字段相对简单,不耗资源. 我们首先不去否定上面的结论对不对.
-
js中new一个对象的过程
使用new关键字调用函数(new ClassA(-))的具体步骤: 1. 创建空对象{} 2. 使用新对象,调用函数,函数中的this被指向新实例对象: {}.构造函数(); 3. 设置新对象的constructor属性为构造函数的名称,设置新对象的__proto__属性指向构造函数的prototype对象 4. 将初始化完毕的新对象地址,保存到等号左边的变量中 注意:若构造函数中没有返回值或返回值是基本类型(Number.String.Boolean)的值,
-
JS中‘hello’与new String(‘hello’)引出的问题详解
定义一个字符串 在工作中我们大概有3种方法去定义一个字符串: 1. var str = 'hello'; 2. var str1 = String('hello'); 3. var str2 = new String('hello'); (下文直接会带 以上三个变量....) 这三种方法定义出来的 'hello',都有自己的属性 例如lengh,有自己的方法例如: indexOf(),在日常工作定义中也没有感觉到任何的不同. 那是否深入过, 1.这三种方式定义出来的'hello',是否是一样的呢
-
原生JS封装_new函数实现new关键字的功能
一.前言 众所周知:没有对象怎么办?那就new一个! 那么在JS中,当我们new一个对象的时候,这个new关键字内部都干了什么呢? 现在我们就来剖析一下原生JS中new关键字内部的工作原理. 二.原始的new 首先,我们先new一个对象看看: //创建Person构造函数,参数为name,age function Person(name,age){ this.name = name; this.age = age; } //实例化对象小明 xm = new Person('xiaoming',1
-
原生JS封装Ajax插件(同域、jsonp跨域)
抛出一个问题,其实所谓的熟悉原生JS,怎样的程度才是熟悉呢? 最近都在做原生JS熟悉的练习... 用原生Js封装了一个Ajax插件,引入一般的项目,传传数据,感觉还是可行的...简单说说思路,如有不正确的地方,还望指正^_^ 一.Ajax核心,创建XHR对象 Ajax技术的核心是XMLHttpRequest对象(简称XHR),IE5是第一款引入XHR对象的浏览器,而IE5中的XHR对象是通过MSXML库中的一个ActiveX对象实现的,因此在IE中可能有3个版本,即MSXML2.XMLHttp.
-
使用原生js封装的ajax实例(兼容jsonp)
实例如下: /* 封装ajax函数 * @param {string}opt.type http连接的方式,包括POST和GET两种方式 * @param {string}opt.url 发送请求的url * @param {boolean}opt.async 是否为异步请求,true为异步的,false为同步的 * @param {object}opt.data 发送的参数,格式为对象类型 * @param {function}opt.success ajax发送并接收成功调用的回调函数 */
-
原生js封装运动框架的示例讲解
昨天我们说了一下原生JS中常用的兼容性写法,今天我们来说一下运动框架. 正常情况下我们要写一个运动的效果会用到tween.js这么一个插件,这个东西不是一般人写出来的,因为里面涉及的运动效果都是经过一堆数学的函数运算出来的,我们平常人是写不出来的,所有我们就自己封装一个运动框架,有什么问题改起来也方便,下面我们就开始封装. 首先,我们先写一个div,设置一些简单的样式,我们就拿这个div举例子 如下代码: #div{ width: 100px; height: 100px; background
-
原生JS封装animate运动框架的实例
如下所示: <!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8"> <title></title> <style> div { width: 100px; height: 100px; background-color: pink; position: absolute; left: 0; top: 50px; b
-
原生JS封装拖动验证滑块的实现代码示例
前言 星期六闲着没事,就想着写写原生js玩玩,在网上看了几个效果后决定做这个效果,并且使用了prototype和eventEmitter封装成了库. 最终效果 分析 看到这个效果我们首先应该想到和拖动有关的api: onmousedown, onmousemove, onmouseup 其次要支持用户传入放置这个组件的dom元素和完成的回调事件. 最终如何使用? 我们先来看下使用方式,再来决定我们怎么编写这个库 具体使用就是这样的,我们还想用户能通过import等方式使用,所以我们就要支持esM
-
基于原生JS封装的Modal对话框插件的示例代码
基于原生JS封装Modal对话框插件,具体内容如下所示: 原生JS封装Modal对话框插件,个人用来学习原理与思想,只有简单的基本框架的实现,可在此基础上添加更多配置项 API配置 //基本语法 let modal = ModalPlugin({ //提示的标题信息 title:'系统提示', //内容模板 字符串 /模板字符串/DOM元素对象 template:null, //自定义按钮信息 buttons:[{ //按钮文字 text:'确定', click(){ //this:当前实例 }
-
原生js封装无缝轮播功能
原生js封装无缝轮播插件,供大家参考,具体内容如下 说明: 这是一个使用原生js.es5语法写出的无缝轮播程序,代码中对相关api进行了封装,使得在引入该轮播js文件后,只需要在自己的js文件中添加两行代码即可在网页中实现一个基本的无缝轮播图效果. 基本使用步骤为:获取dom元素数组.向轮播对象中传参.轮播对象调用自动轮播方法. 除基本的定时器自动轮播功能外,该程序还支持设置过渡动画时间.设置鼠标移入元素自动轮播停止.设置点击左右侧边按钮时轮播.设置点击下方按钮时轮播功能. 该程序不需要依赖cs
-
原生js封装添加class,删除class的实例
一.添加class function addClass(ele,cName) { var arr = ele.className.split(' ').concat(cName.split(" ")); for(var i=0;i<arr.length;i++){ for(var k=arr.length-1;k>i;k--){ (arr[k]==="")&&arr.splice(k,1); (arr[i]===arr[k])&&
-
原生js 封装get ,post, delete 请求的实例
现在的项目中都在用VUE 以及react 等MVC, MVVM 框架. 丢弃了原始的JQ .不可能为了个$.ajax();而把JQ引进来吧. 在vue1的开发中 提供了 vueResouce, vue2 出来后明确提出了不在更新vueResouce 而提供axios 的方法. 在react 的开发中提供fetch 封装的方法.等等.但在工作与后台的交互中基本都是form表单的形式.于是自己封装了个 POST,GET,DELETE 的请求方式.当然根据不同的公司,不同的方式.都可以自己扩展.目前
随机推荐
- CI映射(加载)数据到view层的方法
- 配置apache默认使用ssl的方法
- Bootstrap笔记—折叠实例代码
- 用js实现计算代码行数的简单方法附代码
- 使用Entity Framework(4.3.1版本)遇到的问题整理
- php的api数据接口书写实例(推荐)
- smarty获得当前url的方法分享
- python字符串中的单双引
- 小论asp中request与response的用法
- mysqld_safe启动脚本源码阅读、分析
- MySQL正则表达式入门教程
- BootStrap 智能表单实战系列(十)自动完成组件的支持
- JavaScript动态创建link标签到head里的方法
- SQL Server查看未释放游标的方法
- Jquery中LigerUi的弹出编辑框(实现方法)
- javascript控制图片播放的实现代码
- Java中BufferedReader与BufferedWriter类的使用示例
- java 中 MD5加密的实例
- 什么是Spring Boot
- android耳机左右声道接反具体修正方法