new 一个对象或者函数的时候,它中间发生了什么事情?原理是什么?

在JavaScript中,当你使用new关键字来创建一个对象或调用一个构造函数时,实际上发生了几个关键步骤和原理,这些步骤和原理共同协作以生成一个新的对象实例。以下是这些步骤和原理的详细解释:

1. 创建一个空对象

首先,JavaScript会创建一个空对象(即{})。这个新创建的空对象会继承其构造函数的prototype属性中的方法和属性。这意呀着,如果构造函数(或其原型链上的某个原型)定义了一些方法或属性,这些方法和属性将能够被新创建的对象访问。

2. 设置原型链

接下来,JavaScript会将这个新对象的内部[[Prototype]](即__proto__,但在现代JavaScript中应使用Object.getPrototypeOf()来访问)链接到构造函数的prototype对象上。这样,新对象就可以访问构造函数原型上定义的所有属性和方法。

3. 绑定this

然后,构造函数会被调用,并且this关键字会被绑定到新创建的对象上。这意味着,在构造函数中通过this添加的任何属性或方法都将被添加到新对象上。

4. 返回新对象

如果构造函数返回了一个对象(使用return语句),那么这个返回的对象将被用作new表达式的结果。然而,如果构造函数没有显式地返回一个对象,那么就会返回第一步中创建的那个对象实例。

原理总结

  • 继承:通过原型链实现继承,使得新对象能够访问构造函数原型上定义的属性和方法。
  • 封装:通过this关键字在构造函数内部封装对象的状态和行为。
  • 构造函数:是一个特殊的函数,用于初始化新创建的对象。
  • 原型:每个函数都有一个prototype属性,它是一个对象,包含可以由特定类型的所有实例共享的属性和方法。

示例

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

Person.prototype.sayGoodbye = function() {
console.log('Goodbye!');
};

const person1 = new Person('Alice', 30);

console.log(person1.name); // Alice
person1.greet(); // Hello, my name is Alice and I am 30 years old.
person1.sayGoodbye(); // Goodbye!

在这个例子中,Person是一个构造函数,它接收nameage作为参数,并使用this关键字将这两个属性添加到新创建的对象上。Person.prototype.sayGoodbye是定义在Person原型上的方法,因此所有Person的实例都可以访问这个方法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值