ES6中的Class不用new就报错的实现

昨天面试的时候,遇到了一个问题,ES6中的class不使用new就会报错,请问你如何用ES5的构造函数实现同样的效果。
当时我是一脸懵逼的,面试结束后,自己一直在思考这个问题,仔细想了想new的整个过程

function  myNew(fn){
	let O = Object.create(fn.prototype);
	let S = fn.apply(O);
	return   typeof   S === 'object' ?  S : O;
}

那么是否使用new来调用构造函数的区别在于哪里?
我们可以看到,在使用new时,有一个 fn.apply(O); 这就是解决这道题的关键点,我们可以在构造函数的内部,去判断当前的this的指向。我们知道,默认情况下,函数内部的this的指向是指向window或者undefined的。所以,我们可以这样来实现:

function myClass(){
	try{
		if(  this.__proto__ !== myClass.prototype ){
			throw Error("No New");
		}
	}catch(e){
		console.err(e);
	}
}

如此,我们就实现了构造函数不使用new来调用,其就会报错的功能。

ES6 中,类(`class`)提供了一种更清晰和结构化的方式来定义对象及其方法。通过类定义的方法可以直接使用类的实例进行调用。以下是如何通过实例调用 `class` 定义的方法的详细说明。 ### 通过实例调用类方法 定义一个类后,可以通过创建类的实例来调用类中的方法。类中的方法定义在 `class` 的主体中,通常不需要使用 `function` 关键字[^1]。 #### 示例代码 ```javascript class Book { constructor(title, author) { this.title = title; this.author = author; } // 定义一个类方法 getDetails() { return `${this.title} by ${this.author}`; } } // 创建类的实例 const myBook = new Book("ES6 Essentials", "John Doe"); // 通过实例调用类方法 console.log(myBook.getDetails()); // 输出: ES6 Essentials by John Doe ``` 在这个示例中,`getDetails` 是 `Book` 类的一个方法,通过 `myBook` 实例进行调用。 ### 类方法的调用机制 类方法是定义在类的原型(`prototype`)上的,这意味着所有类的实例共享这些方法。当通过实例调用方法时,JavaScript 引擎会查找实例的原型链,找到对应的方法并执行[^2]。 #### 示例代码 - 原型链上的方法 ```javascript class Animal { speak() { console.log("Some sound"); } } class Dog extends Animal { speak() { console.log("Woof!"); } } const dog = new Dog(); dog.speak(); // 输出: Woof! ``` 在上面的代码中,`Dog` 类继承了 `Animal` 类,并重写了 `speak` 方法。当通过 `dog` 实例调用 `speak` 方法时,JavaScript 会优先查找 `Dog` 类的原型,找到后执行。 ### 静态方法的调用 如果方法被定义为静态方法(`static`),则不能通过实例调用,而是直接通过类本身调用。 #### 示例代码 - 静态方法 ```javascript class Utility { static formatText(text) { return text.trim().toUpperCase(); } } // 通过类直接调用静态方法 console.log(Utility.formatText(" hello ")); // 输出: HELLO // 通过实例调用静态方法会报错 const util = new Utility(); console.log(util.formatText()); // 报错: util.formatText is not a function ``` ### 类方法的私有性 在 ES6 中,类的方法默认是公开的。如果需要定义私有方法,可以通过约定(如使用下划线 `_` 前缀)或使用模块模式来实现。 #### 示例代码 - 私有方法 ```javascript class Counter { #count = 0; // 私有属性 increment() { this.#count++; } getCount() { return this.#count; } } const counter = new Counter(); counter.increment(); console.log(counter.getCount()); // 输出: 1 console.log(counter.#count); // 报错: SyntaxError: Private field '#count' must be declared in an enclosing class ``` 在上面的代码中,`#count` 是一个私有属性,只能在 `Counter` 类内部访问。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值