个人简介
今天是2023年4.23号 这是我第二次写文章,其实我也不知道能坚持多久,也不知道这样是否有意义 但我还是想试试 如果明知道是对的,为何不坚持下去?如果早知道是错的,为何还要做下去
一、什么是原型
就是每个对象都有原型(prototype)属性,它指向另一个对象,这个对象就是这个对象的原型,原型就是js中实现继承的机制之一
二、什么是原型链
原型链就是一个对象的原型指向另一个对象的原型就形成了原型链(prototype chain)
原型链是js实现继承的机制之一,当我们访问一个对象的属性或方法时,如果这个对象本身没有这个属性或方法,JavaScript会沿着原型链向上查找,直到找到该属性或方法为止。
原型链的顶端是Object.prototype,它是所有对象的原型,Object.prototype的原型是null,表示它没有原型,所以呢,当我们访问一个对象的属性或方法时,如果原型链上找不到这个属性或方法,就会返回undefined
三、原型和原型链的区别
原型和原型链是js中两个相关但不同的概念
原型是一个对象的属性,它指向另一个对象,用于实现继承和属性或方法的共享,
原型链是由一个对象的原型属性指向另一个对象的原型属性,形成的一个链式结构,用于实现继承成和属性或方法的查找
四、原型链有什么用处吗
1、实现属性和方法的共享:原型链可以让对象之间共享属性和方法,这样可以减少内存的使用,提高代码的复用性
2、实现继承:原型链可以让一个对象继承和另一个对象的属性和方法,这样可以避免重复代码
3、简化代码:原型链可以让我们使用更简洁的代码来实现继承和共享属性的方法
4、扩展对象的功能:原型链可以让我们在不改变对象本身的情况下,通过修改原型对象来扩展对象的功能,这样避免直接修改对象本身带来的风险
五、怎么使用原型链呢
1、创建一个构造函数:构造函数是用来创建对象的函数,它可以包含一些属性和方法,这些属性和方法可以被这个构造函数创建的所有对象共享
2、给构造函数的原型对象添加属性和方法:构造函数的原型对象是一个普通的对象,它可以包含一些属性和方法,这些属性和方法可以被构造函数创建的所有对象共享
3、创建一个子类构造函数:子类构造函数可以通过调用父类构造函数来继承父类的属性和方法,同时也可以添加自己的属性和方法
4、将子类构造函数的原型对象指向父类构造函数的实例:这样子类构造函数就可以通过原型链访问父类构造函数的属性和方法
下面用代码举例
// 父类构造函数
function Animal(name) {
this.name = name;
}
// 父类构造函数的原型对象
Animal.prototype.sayName = function() {
console.log('My name is ' + this.name);
};
// 子类构造函数
function Dog(name, breed) {
Animal.call(this, name);
this.breed = breed;
}
// 将子类构造函数的原型对象指向父类构造函数的实例
Dog.prototype = Object.create(Animal.prototype);
Dog.prototype.constructor = Dog;
// 子类构造函数的原型对象
Dog.prototype.sayBreed = function() {
console.log('My breed is ' + this.breed);
};
// 创建一个Dog对象
var dog = new Dog('Tom', 'Labrador');
// 调用父类构造函数的方法
dog.sayName(); // 输出:My name is Tom
// 调用子类构造函数的方法
dog.sayBreed(); // 输出:My breed is Labrador