首页 > 其他分享 >简单实现new关键字,及为什么当result为对象则返回这个对象?

简单实现new关键字,及为什么当result为对象则返回这个对象?

时间:2024-03-01 12:00:38浏览次数:25  
标签:返回 对象 关键字 result new 构造函数

下面是一个简单的 JavaScript 代码示例,演示了如何手动实现 new 关键字的功能:

function myNew(constructor, ...args) {
  // 创建一个新对象,该对象继承自构造函数的原型
  var instance = Object.create(constructor.prototype);
  
  // 在新对象上调用构造函数,并传入参数
  var result = constructor.apply(instance, args);
  
  // 如果构造函数返回了一个对象,则返回这个对象;否则返回新创建的对象
  return (typeof result === 'object' && result !== null) ? result : instance;
}

// 测试
function Person(name, age) {
  this.name = name;
  this.age = age;
}

var person = myNew(Person, "Alice", 25);
console.log(person.name); // 输出:Alice
console.log(person.age);  // 输出:25

在这个示例中,myNew 函数接受一个构造函数和一系列参数,并手动实现了 new 关键字的功能。它创建了一个新的对象,将构造函数的原型赋值给这个新对象,然后在新对象上调用构造函数,并返回相应的实例。

为什么如果构造函数返回了一个对象,则返回这个对象?

当构造函数中使用 new 关键字创建实例时,如果构造函数内部返回的是一个对象(而不是基本数据类型),那么最终表达式的值会是这个返回的对象,而不是新创建的实例。

这种情况下,返回的对象将替代使用 new 关键字创建的实例。这样做的目的可能是为了在构造函数中进行一些特殊处理,并根据特定条件返回不同的对象。这种方式可以让构造函数更加灵活,根据需要返回不同的对象实例。

因此,在手动实现 new 的功能时,我们需要检查构造函数的返回值,如果是对象类型,则直接返回该对象;否则返回新创建的实例对象。这样可以确保符合 JavaScript 中 new 关键字的行为,保持代码逻辑的一致性。

标签:返回,对象,关键字,result,new,构造函数
From: https://www.cnblogs.com/crispyChicken/p/18046663

相关文章

  • Rust的Display和ToString:将对象转换为字符串
    在写代码的时候,我们经常需要将对象输出到屏幕上,或者转换为字符串;在Python中,我们可以为类型定义魔法函数__str__,print和str()都会调用它;在C++中,我们可以为对象重载ostream&operator<<(ostream&os)函数,使用ostringstream、fstream和cout的时候会调用它。在Rust中该实现什么,想必大......
  • 使用脚本排查出近n天表空间增长对象
    SETLINES200PAGES200COLOWNERFORA10WITHT1AS(SELECTTO_CHAR(B.BEGIN_INTERVAL_TIME,'YYYYMMDD')SNAPDATE,A.TS#,A.OBJ#,TRUNC(SUM(A.SPACE_ALLOCATED_DELTA)/1024/1024)DELTA_MBFROMDBA_HIST_SEG_STATA,......
  • new_cost
    packagecom.example.myaccountapp;importandroidx.appcompat.app.AppCompatActivity;importandroid.content.ContentValues;importandroid.database.sqlite.SQLiteDatabase;importandroid.os.Bundle;importandroid.view.Gravity;importandroid.view.View;importandr......
  • jq ajax传递json对象到服务端及contentType的用法
    目录0、一般情况下,通过键值对的方式将参数传递到服务端0.1客户端代码:0.2服务端代码:0.3在浏览器的网络中查看此次请求:1、ajax传递复杂json对象到服务端1.1方法一:通过formdata传值,服务端通过key获取值;1.2方法二:通过formdata方式传值,服务端读取Request.InputStrea......
  • 数组对象删除不满足某些条件的对象 js
    recursiveFunction(items,childrenNodeName,ids){console.log('items',ids);//获取数组长度if(items)items=[];letlen=items?.length//循环遍历数组for(leti=0;i<len;i++){//如果有子节点,递归遍历......
  • 对象的使用
    既然现在我们知道如何创建对象,那么我们怎么去访问这个对象呢,比如我现在想要去查看或是修改它的名字。我们同样可以使用一个变量来指代某个对象,只不过引用类型的变量,存储的是对象的引用,而不是对象本身:publicstaticvoidmain(String[]args){//这里的a存放的是具体的某个值......
  • 面向对象—【类与对象】【类的定义与对象创建】【对象的使用】【方法创建与使用】【方
    面向对象基础篇我们在前面已经学习了面向过程编程,也可以自行编写出简单的程序了。我们接着就需要认识面向对象程序设计(ObjectOrientedProgramming)它是我们在Java语言中要学习的重要内容,面向对象也是高级语言的一大重要特性。面向对象是新手成长的一道分水岭,有的人秒懂,有的人......
  • xlua - lua中操作c#对象
    1,c#对象映射为lua的userdataa)默认情况,c#对象都是映射为lua的userdata,数据存放在c#层,调用函数也是走c#层。functionLuaUseVector3(v1,v2)v1.x=10print(type(v1),v1.x,v1.y,v1.z)print("v1:",v1,"v2:",v2)print("v1+v2:",v1+v2)v1......
  • 面向对象—【类与对象】【类的定义与对象创建】【对象的使用】【方法创建与使用】【方
    @目录面向对象基础篇类与对象类的定义与对象创建对象的使用方法创建与使用方法进阶使用构造方法源码:Giteehttps://gitee.com/drip123456/java-seGIthubhttps://github.com/Drip123456/JavaSE专栏:JavaSE笔记专栏面向对象基础篇我们在前面已经学习了面向过程编程,也可以自......
  • Java面向对象之内部类的几类使用场景
    介绍Java内部类是一种特殊的类,它定义在另一个类的内部。内部类提供了许多有用的特性,包括访问外部类的私有成员、隐藏实现细节以及实现回调接口等。以下是Java内部类的一些常用场景及其举例说明:回调接口当某个类需要一个对象来执行其方法时,通常可以使用回调接口。这时,内部类可以......