构造函数简介与返回值问题[手写代码]

简介

JavaScript 中的构造函数是用来创建特定类型对象的函数,通常被用来定义类(class)。通过构造函数,我们可以定义对象的属性和方法,并通过 new 关键字实例化出一个对象,这个对象就是该构造函数所定义的类型。

构造函数的一般形式如下:

functionPerson(name, age) {
  this.name=name;
  this.age=age;
  this.greet=function() {
    console.log(`Hello, my name is ${this.name}and I'm ${this.age}years old.`);
  };
}

在上面的代码中,我们定义了一个名为 Person 的构造函数,它接受两个参数 nameage,并在构造函数内部通过 this 关键字将它们作为对象的属性。在 Person 构造函数中,我们还定义了一个名为 greet 的方法,用于打印出个人信息。

使用构造函数创建对象的方法非常简单,只需要通过 new 关键字调用构造函数即可。例如,下面的代码可以使用 Person 构造函数创建两个对象:

constperson1=newPerson('Alice', 25);
constperson2=newPerson('Bob', 30);
​
person1.greet(); // 输出 "Hello, my name is Alice and I'm 25 years old."
person2.greet(); // 输出 "Hello, my name is Bob and I'm 30 years old."
构造函数返回值问题

构造函数可以有返回值,但是这个返回值通常不是对象本身,而是一个基本数据类型或者其他对象。如果构造函数显式返回一个基本数据类型,那么这个值将被忽略。如果构造函数显式返回一个对象,那么该对象将被用作 new 关键字创建出的对象。

例如,下面的代码中,构造函数返回了一个字符串,但是它被忽略了:

functionMyString(str) {
  this.value=str;
  return'this is a string'; // 显式返回一个字符串
}
​
constmyStr=newMyString('hello');
console.log(myStr.value); // 输出 "hello"

如果构造函数显式返回一个对象,那么该对象将被用作 new 关键字创建出的对象。例如,下面的代码中,构造函数返回了一个对象,该对象被用作 new 关键字创建出的对象:

functionMyObject() {
  this.name='My Object';
  return {
    name: 'Another Object'
  };
}
​
constmyObj=newMyObject();
console.log(myObj.name); // 输出 "Another Object"

总之,构造函数是用来创建特定类型对象的函数,通常用于定义类(class)。构造函数可以定义对象的属性和方法,并通过 new 关键字实例化出一个对象。构造函数可以有返回值,但是这个返回值通常不是对象本身,而是一个基本数据类型或者其他对象。

题目辅助理解

如果以下程序的输出结果是false,则①式可以替换为()

consttest= {rules: false};
functionBuild() {
    this.rules=true;    
    ①
}
constbuild=new   Build();
console.log(build.rules);

A  return false;
B  return this.rules;
C  return test;
D  什么都不做

如果构造函数有返回值且返回值为一个对象,则由构造函数创建的实例对象即为返回的对象;

如果返回的是一个基本数据类型或者返回this,或者没有返回值,则默认返回由该构造函数创建的实例对象。

在本题中,只有C选项会使得构造函数返回的是test对象,其他选项会使得构造函数返回的都是由构造函数创建的实例。由于test对象的rules属性值为false,而构造函数创建的实例,其rules属性值为true,故只有C选项正确。

手写new
functionmyNew(Fun, ...args) {
    // 创建一个对象
    letobj= {};
    // 改变 obj 的 __proto__ 指向 Fun 的 prototype
    obj.__proto__=Fun.prototype;
    // 改变 Fun 的 this 指向 obj,并执行 Fun 函数
    letres=Fun.call(obj, ...args);
    // 如果 Fun 显示的返回了对象或函数,则返回该值
    if (res&& (typeofres==="object"||typeofres==="function")) {
      returnres;
    }
    // 否则,返回 obj 对象
    returnobj;
  }

上面的代码是实现一个叫做 myNew 的函数,该函数是实现 JavaScript 中的 new 操作的模拟实现。

myNew 函数接收两个参数:构造函数 Fun 和一些参数 ...args,它的实现步骤如下:

  1. 创建一个空对象 obj

  1. 改变 obj__proto__ 属性指向 Funprototype 属性。

  1. 使用 call 方法,改变 Funthis 指向 obj,并执行 Fun 函数。

  1. 判断 Fun 函数是否有显示的返回对象或函数,如果有,则返回该值;否则,返回 obj 对象。

因此,myNew 函数的行为类似于 JavaScript 中的 new 操作,它创建一个空对象,并使用构造函数和参数初始化该对象。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

学不会只能哭

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值