当前位置: 首页 > article >正文

面试之《new关键字》

一问:new关键字做了什么操作,手写一个new方法,实现new关键字的作用
二问:

// 第一题 /
function Test(){
    this.name = '1';
    return {name: '2'}
}
const a = new Test();
console.log(a.name)  // 打印什么

/// 第二题 /
function Test2(){
    this.name = '1';
    return 123
}
const a = new Test2();
console.log(a.name) // 打印什么

以下是我的粗浅见解,如有问题,请大家多多指教!还望大家共同进步!

  1. 创建一个新对象
function Person(name) {
    this.name = name;
}
 
var person = new Person('Alice');
  1. 在新对象上运行[[Prototype]]连接
Person.prototype.sayName = function() {
    console.log(this.name);
};
 
person.sayName(); // 'Alice'
  1. 将构造函数的this指向新对象
// 在构造函数内部
function Person(name) {
    this.name = name;
}
  1. 返回对象

如果构造函数没有返回对象类型Object(包括Functoin, Array, Date等),
或者构造函数返回了非原始类型值(如字符串, 数字), 则忽略返回值, 使用新创建的对象.
如果构造函数显式返回undefined或null, 则同样忽略, 使用新创建的对象.
如果构造函数返回了一个对象, 则新创建的对象会被忽略, 返回的对象会成为最终的结果. 这是重点!要考!

function Person(name) {
    this.name = name;
    // return undefined; // 或者任何非对象值, 结果同样
}
 
var person = new Person('Alice');
console.log(person.name); // 'Alice'
 
// **** 关键测试用例! ****
function PersonWithObject(name) {
    this.name = name;
    return { greeting: 'Hello' };
}
 
var person = new PersonWithObject('Alice');
console.log(person.name); // undefined
console.log(person.greeting); // 'Hello'

所以手写new可以这么写

function _new(constructor, ...args) {
  // 第一种方法
  // const obj = {};
  // obj.__proto__ = constructor.prototype;
  
  // 第二种方法
  const obj = Object.create(constructor.prototype);
  
  const res = constructor.apply(obj, args);
  return ["object", "function"].includes(typeof res) ? res : obj;
}

第二问答案:
问题一:2,因为构造函数返回的是一个对象,所以直接使用返回的对象,不再构建新的对象
问题二:1,构造函数返回的不是一个对象,所以需要构造新的对象,并主动调用构造函数,构造函数会将obj.name赋值为1,所以打印出来1.


http://www.kler.cn/a/504636.html

相关文章:

  • IDEA的Java注释在Toggle Rendered View下的字号调整方式
  • 网络层协议-----IP协议
  • 设计模式 行为型 访问者模式(Visitor Pattern)与 常见技术框架应用 解析
  • 蓝牙BT04-A的使用与相关AT指令
  • Spring Data Elasticsearch简介
  • 回归预测 | MATLAB实RVM-Adaboost相关向量机集成学习多输入单输出回归预测
  • python创建pdf水印,希望根据文本长度调整水印字体大小,避免超出页面
  • [Qt]常用控件介绍-输入类控件-QSpinBox、DateTimeEdit、Dial、Silder控件
  • C++笔记:打包独立运行的exe(在静态库中使用MFC)
  • 使用yarn命令创建Vue3项目
  • Microsoft Sql Server 2019 触发器
  • 利用 rclone 挂载华为云 OBS 到本地
  • 图-岛屿-dfs
  • 什么是docker?关于docker容器的全面详细介绍
  • Spring MVC流程一张图理解
  • 获取文章列表功能
  • LeetCode热题100-有效的括号【JavaScript讲解】
  • 常见好用的PHP CMS开源系统有哪些?
  • javaEE-网络原理-IP协议
  • 微信小程序实现个人中心页面
  • Ubuntu磁盘空间不足或配置错误时,如何操作扩容?
  • Starrocks 存算分离 VS Trino 性能测试
  • 银河麒麟V10安装第二个nginx服务
  • Unity 自定义批量打包工具
  • TCP、UDP的区别及使用场景
  • 装备制造业:建立项目“四算”管理:以合同为源头,以项目为手段实现合同的测算、预算、核算与决算的管控体系