模拟实现js中的new操作符

能否实现js的new操作符

new

new运算符创建了一个用户自定义的对象类型的实例或具有构造函数的内置对象类型之一

定义一个构造函数Student,该函数接收两个参数name和age:

function Student(name,age){
this.name=name
this.age=age
}

let first=new Student('dylan','26')
console.log(first.name);// dylan
console.log(first.age);// 26

new实现了那些功能:

  1. 创建了一个空对象
  2. 空对象的原型指向了构造函数的原型
  3. 让this指向新创建的空对象,并且执行对象的主体(为这个新对象添加属性)
  4. 判断返回值的类型,如果是值类型就返回新创建的对象,如果是引用类型,就返回这个引用类型的对象
  5. 如果函数没有返回对象类型Object(包括Functoin, Array, Date, RegExg, Error),那么new表达式中的函数调用将返回该对象的引用
function copyNew(obj,...args){
  //1.创建了一个空对象
  const newObj={}
  //2. 空对象的原型指向了构造函数的prototype
  newObj.__proto__=obj.prototype
  //上面的两步可以合为一步
  // let newObj=Object.create(obj.prototype)
  //3. 将obj的this改为新创建对象
  let result=obj.apply(newObj,args)
  //判断类里面有返回值吗?返回值是对象吗?如果是的那那就返回类中的返回值,如果不是的话那就返回新创建的对象
    return typeof result ==='object'?result:newObj
}

如果构造函数返回了一个“对象”,那么这个对象会取代整个new出来的结果。如果构造函数没有返回对象,那么new出来的结果为步骤1创建的对象。(一般情况下构造函数不返回任何值,不过用户如果想覆盖这个返回值,可以自己选择返回一个普通对象来覆盖。当然,返回数组也会覆盖,因为数组也是对象。

原文地址:https://www.cnblogs.com/my466879168/p/12332842.html

时间: 2024-07-30 00:34:07

模拟实现js中的new操作符的相关文章

js中的new操作符与Object.create()的作用与区别

js中的new操作符与Object.create()的作用与区别 https://blog.csdn.net/mht1829/article/details/76785231 2017年08月06日 19:19:26 阅读数:1058 一.new 操作符 JavaScript 中 new 的机制实际上和面向类的语言完全不同. 在 JavaScript 中,构造函数只是一些使用 new 操作符时被调用的函数.它们并不会属于某个类,也不会实例化一个类.实际上,它们甚至都不能说是一种特殊的函数类型,它

js中的new操作符

一.js中new操作符来声明一个对象:例如有如下一个实例function Person(){Person.prototype.fn=function(){console.log(1);}}var p=new Person(); 上例中使用new操作符来声明一个对象实际上是进行了三个动作: 1.var p={}; 2.p._proto_=Person.prototype; 3.Person.call(p); 二.以上的三个操作是在使用new操作符创建对象的时候实际执行的动作. 以上为本人对new操

JS中的delete操作符

首先,delete删除成功返回true,失败返回false. js代码: function wxCount ($element) { this.init($element); } wxCount.prototype = { init : function(){...}, //初始化方法 count : function(){...}, //计算方法 destroy : function(){ delete this; } //删除方法 } 仔细一看便知,这里的this指向的是function w

JS中的new操作符原理解析

1 var Person = function(name){ 2 this.name = name; 3 } 4 Person.prototype.sayHello = function() { 5 console.log('hello ' + this.name); 6 } 7 var p1 = new Person('HANMEI'); 8 p1.sayHello(); 1. 创建一个类的实例:创建一个空对象obj,然后把这个空对象的__proto__设置为Person.prototype(

js中操作符 || 和 &&

一.第一部分(引子) 先来介绍一下在js中由其他数据类型转化为boolean时到底是转化成true还是false js中,当以下值转成boolean类型的时候,会被转换成false 0 ""(空串) false undefined null NaN 其余的则会被转化为true 这里顺便说一句,js中将数据转化为boolean类型的方式有 1.Boolean() 2.!! //eg var value = 5; console.log(typeof value);//number con

为什么不要在 JavaScript 中使用位操作符?

如果你的第一门编程语言不是 JavaScript,而是 C++ 或 Java,那么一开始你大概会看不惯 JavaScript 的数字类型.在 JavaScript 中的数字类型是不区分什么 Int,Float,Double,Decimal 的.咳咳,我说的当然是在 ES6 之前的 JS,在 ES6 的新标准中提出了像 Int8Array 这样新的数据类型.不过这不是本文叙述的重点,暂且就不谈啦.本文将更着重地谈 JS 的数字类型以及作用于它的位操作符,而关于包装对象 Number 的更多了解可以

【js实例】js中的5种基本数据类型和9种操作符

js中的5中基本数据类型 js标识符 第一个字符必须为字母,下划线,或美元符 其他字符可以是字母,下划线,美元符,数字 js标识符区分大小写 标识符不能使关键字和保留字 关键字: break do instanceof typeof case else new var catch finally return void continue for switch while debugger function this with default if throw   delete in try  

js中的操作符

写在前面 js语法 DOM对象(把body,div,p等节点树看成一个对象) BOM对象(把浏览器的地址栏历史记录DOM等装在一个对象) 浏览器是宿主,但js的宿主不限于浏览器,也可以是服务器,如node.js. 运算符: //js中拼接运算符 console.log(2+3); console.log('hello'+''+'world'); console.log(2+3+4+'haha'+5+6);//9haha56,一旦碰到非法数字后,后面的一律理解为“拼接” 例如 var num1=5

在Node.js中使用RabbitMQ系列二 任务队列

在上一篇文章在Node.js中使用RabbitMQ系列一 Hello world我有使用一个任务队列,不过当时的场景是将消息发送给一个消费者,本篇文章我将讨论有多个消费者的场景. 其实,任务队列最核心解决的问题是避免立即处理那些耗时的任务,也就是避免请求-响应的这种同步模式.取而代之的是我们通过调度算法,让这些耗时的任务之后再执行,也就是采用异步的模式.我们需要将一条消息封装成一个任务,并且将它添加到任务队列里面.后台会运行多个工作进程(worker process),通过调度算法,将队列里的任