(一)对象的原型链由来
在 JavaScript 中,每个对象都有一个原型对象。原型对象充当着对象的模板,它包含了常用的属性和方法,子对象可以通过原型链继承这些属性和方法。 每个对象都可以通过__proto__属性访问它的原型对象,对象的原型对象也可以拥有自己的原型对象,这就是所谓的原型链。
但是,面对大量对象,JavaScript 在内存中会保存很多原型对象,这样会导致内存浪费。为了解决这个问题,JavaScript 引入了 prototype 属性,用来指定一个构造函数的原型对象,这样所有通过该构造函数创建的对象都会共享一个原型对象,从而达到节约内存的效果。
(二)实现原型继承的两种方式
在 JavaScript 中,实现原型链有两种方式:构造函数式和对象字面量。
1.构造函数式
构造函数式是定义一个函数作为构造函数,再通过 new 关键字创建一个对象的方式,实现原型继承。
例如:
// 构造函数式原型链继承
function Animal() {
this.species = 'mammal'
}
function Cat(name, color) {
Animal.call(this) // 把 Animal 的实例属性添加到 Cat 中
this.name = name
this.color = color
}
let cat1 = new Cat('Tom', 'black')
console.log(cat1.species) //输出 mammal
在这个例子中, Animal 和 Cat 是两个构造函数,用 call 方法将 Animal 的实例属性添加到 Cat 中,从而实现原型链继承。
2.对象字面量
对象字面量是直接使用对象字面量表示对象,通过指定原型对象属性来实现原型继承。
例如:
let animal = {
species: 'mammal'
}
let cat = {
name: 'Tom',
color: 'black'
}
cat.__proto__ = animal; // 指定 cat 对象的原型对象为 animal 对象
console.log(cat.species); //输出 mammal
在这个例子中, animal 对象是一个具有 species 属性的普通对象, cat 对象继承了 animal 对象的所有属性,因为它的原型对象被指定为 animal 对象。
(三)总结
在 JavaScript 中,原型链是实现原型继承的关键,每个对象都有一个__proto__属性,用于访问它的原型对象。原型链的继承方式有两种,一种是通过构造函数式,另一种是通过对象字面量。无论是哪种方式,只要实现了正确的继承方式,就可以达到代码复用和内存节省的目的。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Javascript之旅 对象的原型链之由来 - Python技术站