自己封装一个new

<script>
// 创建一个构造函数
function Father() {
this.name = '小红';
this.eat = function () {
console.log('我叫'+this.name);
}
}
/**
* 1、在内存中创建一个新的对象;
* 2、让this指向这个新的对象;
* 3、执行构造函数里面的代码并给这个对象添加属性和方法;
* 4、返回这个新对象;
*/
// 使用new关键字来创建一个对象;
var fa = new Father()
console.log(fa); // ---------------------------------------- /**
* 实现new的过程
*/
function _new() {
// 1、创建一个空对象;
var obj = {} // 利用 es6 数组的结构特点可以把函数的参数结构出来
var [newfn, ...args] = [...arguments] // 2、将该对象 obj 的原型链 __proto__ 指向构造函数的原型 prototype,
obj.__proto__ = newfn.prototype // 并且在原型链 __proto__ 上设置构造函数 constructor 为要实例化的 newfn
obj.__proto__.constructor = newfn // 3、让构造函数 newfn 的this改变指向到 obj,并执行
var result = newfn.call(obj, ...args) // 4、如果newfn执行后返回的是对象或函数类型,则返回该对象,否则返回 obj
if (
result &&
(typeof result === 'object' || typeof result === 'function')
) {
return result
}
return obj
} // 构造函数;
function f1(name, age) {
this.name = name
this.age = age
this.eat = function() {
return '我叫' + this.name + '今年' + this.age + '岁'
}
} // 创建一个对象;
var obj2 = _new(f1, '小明', 18)
console.log(obj2)
console.log(obj2.name) // 小明
console.log(obj2.eat()) // 我叫小明今年18岁 </script>

new 的实现原理的更多相关文章

  1. 奇异值分解(SVD)原理与在降维中的应用

    奇异值分解(Singular Value Decomposition,以下简称SVD)是在机器学习领域广泛应用的算法,它不光可以用于降维算法中的特征分解,还可以用于推荐系统,以及自然语言处理等领域.是 ...

  2. node.js学习(三)简单的node程序&&模块简单使用&&commonJS规范&&深入理解模块原理

    一.一个简单的node程序 1.新建一个txt文件 2.修改后缀 修改之后会弹出这个,点击"是" 3.运行test.js 源文件 使用node.js运行之后的. 如果该路径下没有该 ...

  3. 线性判别分析LDA原理总结

    在主成分分析(PCA)原理总结中,我们对降维算法PCA做了总结.这里我们就对另外一种经典的降维方法线性判别分析(Linear Discriminant Analysis, 以下简称LDA)做一个总结. ...

  4. [原] KVM 虚拟化原理探究(1)— overview

    KVM 虚拟化原理探究- overview 标签(空格分隔): KVM 写在前面的话 本文不介绍kvm和qemu的基本安装操作,希望读者具有一定的KVM实践经验.同时希望借此系列博客,能够对KVM底层 ...

  5. H5单页面手势滑屏切换原理

    H5单页面手势滑屏切换是采用HTML5 触摸事件(Touch) 和 CSS3动画(Transform,Transition)来实现的,效果图如下所示,本文简单说一下其实现原理和主要思路. 1.实现原理 ...

  6. .NET Core中间件的注册和管道的构建(1)---- 注册和构建原理

    .NET Core中间件的注册和管道的构建(1)---- 注册和构建原理 0x00 问题的产生 管道是.NET Core中非常关键的一个概念,很多重要的组件都以中间件的形式存在,包括权限管理.会话管理 ...

  7. python自动化测试(2)-自动化基本技术原理

    python自动化测试(2) 自动化基本技术原理 1   概述 在之前的文章里面提到过:做自动化的首要本领就是要会 透过现象看本质 ,落实到实际的IT工作中就是 透过界面看数据. 掌握上面的这样的本领 ...

  8. CRC、反码求和校验 原理分析

    3月份开始从客户端转后台,算是幸运的进入全栈工程师的修炼阶段.这段时间一边是老项目的客户端加服务器两边的维护和交接,一边是新项目加加加班赶工,期间最长经历了连续工作三天只睡了四五个小时的煎熬,人生也算 ...

  9. 菜鸟学Struts2——Struts工作原理

    在完成Struts2的HelloWorld后,对Struts2的工作原理进行学习.Struts2框架可以按照模块来划分为Servlet Filters,Struts核心模块,拦截器和用户实现部分,其中 ...

  10. Objective-C中block的底层原理

    先出2个考题: 1. 上面打印的是几,captureNum2 出去作用域后是否被销毁?为什么? 同样类型的题目: 问:打印的数字为多少? 有人会回答:mutArray是captureObject方法的 ...

随机推荐

  1. Spring Boot2 系列教程(三十一)Spring Boot 构建 RESTful 风格应用

    RESTful ,到现在相信已经没人不知道这个东西了吧!关于 RESTful 的概念,我这里就不做过多介绍了,传统的 Struts 对 RESTful 支持不够友好 ,但是 SpringMVC 对于 ...

  2. cogs 1583. [POJ 3237] 树的维护 树链剖分套线段树

    1583. [POJ 3237] 树的维护 ★★★★   输入文件:maintaintree.in   输出文件:maintaintree.out   简单对比时间限制:5 s   内存限制:128 ...

  3. 暑假提高组集训Day1 T1

    说实话,今天的题真的有点难! ~备受打击~ 我们先来看一看第一题吧 看起来好像不太简单,其实并不难 下面来提供两种方法吧 1.做法一 //签到题 /* 那么这一题就是告诉你n个点的坐标,把它们分别放到 ...

  4. 软工作业-14组铁大FaceBook网站使用体验

    铁大facebook是面向铁道大学学生的一个空间网站,空间界面十分朴素,灰色的色调.基本可以满足日常的发动态需求,但也存在一些问题: 比如发动态不是很方便,必须要进入到某一个空间才能发动态 .就有一些 ...

  5. LeetCode 第七题--整数反转

    1. 题目 2.思路 1. 题目 给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转. 示例 1: 输入: 123输出: 321 示例 2: 输入: -123输出: -321示例 ...

  6. Java入门 - 语言基础 - 10.条件语句

    原文地址:http://www.work100.net/training/java-if-else.html 更多教程:光束云 - 免费课程 条件语句 序号 文内章节 视频 1 概述 2 if...e ...

  7. Browser Security-同源策略、伪URL的域

    同源策略 同源策略的文档模型 同源策略(Same Origin policy,SOP),也称为单源策略(Single Origin policy),它是一种用于Web浏览器编程语言(如JavaScri ...

  8. manually Invoking Model Binding / Model Binding /Pro asp.net mvc 5

    限制绑定器 数据源

  9. oracle 11g数据库服务器安装

    系统:windows7旗舰版 64位.oracle数据库服务器版本:oracle11g. 一.下载   1.登录oracle账户: 首先打开谷歌浏览器,输入网址[英文版网址:https://www.o ...

  10. mysql5.7的基本使用

    mysql的基本使用:最简单的增删改查 (建议用类似记事本的东西写代码,错了容易改) 以下就是这篇文章的代码 一,增和查   CREATE DATABASE one; 新建了一个名为one的数据库 S ...