原型 && 原型链
原型关系:
prototype是构造函数的属性,用来定义实例共享的属性和方法。它是一个静态的属性,属于构造函数本身,不属于任何实例。prototype属性允许你定义所有实例共享的行为。通过将方法放在prototype上,你可以减少内存使用,因为所有实例共享同一个方法。__proto__是实例对象的属性,它指向构造函数的prototype,从而实现实例对象与原型对象之间的联系。__proto__属性让实例对象能够沿着原型链查找属性和方法,实现对象之间的继承。通过__proto__,每个对象都可以继承其原型对象的属性和方法,从而实现代码复用和继承。prototype是用来定义构造函数的共享行为的地方,属于构造函数。__proto__是用来实现继承的属性,属于实例对象。两者的结合使得 JavaScript 可以通过原型链机制来实现对象之间的继承,同时保持内存效率和代码复用。
原型: 在 JS 中,每当定义一个对象(函数也是对象)时,对象中都会包含一些预定义的属性。其中每个函数对象都有一个prototype 属性,这个属性指向函数的原型对象。
console.log(obj.__proto__ === Object.prototype); // true
原型链: 是对象通过其原型连接到一个链条,最终指向 Object.prototype。
- 每个函数在创建时都会自动获得一个
prototype属性,这个属性是一个对象,默认情况下它包含一个唯一的属性constructor,constructor指向该函数本身。 - 每个对象都有一个内部属性
__proto__,它指向创建这个对象的构造函数的prototype对象。这个__proto__属性形成了对象的原型链。 - 原型链的终点是
Object.prototype,它的__proto__属性为null,表示不再有更高的原型。这是所有 JavaScript 对象的基础。 - 由于所有对象最终都继承自
Object.prototype,因此所有对象都继承了Object的基本方法,比如toString()、hasOwnProperty()等。
特点: JavaScript对象是通过引用来传递的,我们创建的每个新对象实体中并没有一份属于自己的原型副本。当我们修改原型时,与之相关的对象也会继承这一改变。
new 运算符的实现机制
- 首先创建了一个新的
空对象 设置原型,将对象的原型设置为函数的prototype对象。- 让函数的
this指向这个对象,执行构造函数的代码(为这个新对象添加属性) - 判断函数的返回值类型,如果是值类型,返回创建的对象。如果是引用类型,就返回这个引用类型的对象。