简介
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 的构造函数,它接受两个参数 name 和 age,并在构造函数内部通过 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,它的实现步骤如下:
创建一个空对象 obj。
改变 obj 的 __proto__ 属性指向 Fun 的 prototype 属性。
使用 call 方法,改变 Fun 的 this 指向 obj,并执行 Fun 函数。
判断 Fun 函数是否有显示的返回对象或函数,如果有,则返回该值;否则,返回 obj 对象。
因此,myNew 函数的行为类似于 JavaScript 中的 new 操作,它创建一个空对象,并使用构造函数和参数初始化该对象。