JS中的构造函数、原型、原型链 - 带你深入理解对象创建与继承
2024-01-15 20:07:33
概述:对象创建与继承的基石
在JavaScript中,对象是构建程序的基本单位。我们可以通过new运算符和构造函数来创建对象。构造函数是一种特殊的函数,专门用于创建对象,它总与new运算符一起使用。当我们使用new运算符调用构造函数时,就会创建一个新的对象。这个新对象被称为构造函数的实例对象。
构造函数:对象创建的起点
构造函数是用来创建对象的函数。它与普通函数的区别在于,构造函数必须以大写字母开头,并且总与new运算符一起使用。当我们使用new运算符调用构造函数时,就会创建一个新的对象。这个新对象被称为构造函数的实例对象。
构造函数主要用于初始化对象,即为对象成员变量赋初始值。我们可以把对象中一些公共的属性和方法抽取出来,然后封装到这个函数里面。当创建实例对象时,对于简单的数据类型,直接赋值就可以,对于复杂数据类型,当创建p1这个实例对象时,会单独开辟一块内存空间,然后把p保存到内存空间中。我们就可以直接访问这个内存空间,但当对p进行复制的时候,他复制的只是p这个变量的引用地址,因此是对p创建的一个别名,两者指向的是同一个内存空间,无论如何修改p和p2,都会反应到同一个内存空间里面。
原型:对象方法和属性的来源
每个构造函数都有一个prototype属性,指向一个对象,这个对象被称为构造函数的原型对象。原型对象包含了一些属性和方法,这些属性和方法可以被构造函数的所有实例对象共享。
原型对象是一个特殊的对象,它本身也是一个对象,因此它也有自己的prototype属性,这个属性指向Object.prototype对象。Object.prototype对象是所有JavaScript对象(包括函数对象)的原型对象。
原型链:对象的继承机制
每个对象都有一个__proto__属性,这个属性指向对象的原型对象。原型对象也有一个__proto__属性,以此类推,形成一个链式结构,称为原型链。
原型链的作用是,当我们在访问一个对象的属性或方法时,如果这个对象本身不包含这个属性或方法,那么就会沿着原型链向上查找,直到找到包含这个属性或方法的对象为止。
构造函数继承:原型链的应用
在JavaScript中,我们可以通过构造函数继承来实现对象的继承。所谓构造函数继承,就是让一个构造函数的原型对象指向另一个构造函数的原型对象。这样,第一个构造函数的所有实例对象都可以继承第二个构造函数的原型对象中的属性和方法。
实例:理解构造函数、原型和原型链
为了更好地理解构造函数、原型和原型链,我们来看一个例子:
function Person(name) {
this.name = name;
}
Person.prototype.sayHello = function() {
console.log(`Hello, my name is ${this.name}`);
};
const person1 = new Person('John');
person1.sayHello(); // Hello, my name is John
const person2 = new Person('Mary');
person2.sayHello(); // Hello, my name is Mary
在这个例子中,我们定义了一个构造函数Person,它有一个name参数,用于为每个实例对象设置name属性。Person.prototype对象包含一个sayHello方法,用于打印出对象的name属性。
然后,我们创建了两个实例对象person1和person2,并调用它们的sayHello方法。输出结果是:
Hello, my name is John
Hello, my name is Mary
从这个例子中,我们可以看到,person1和person2都继承了Person.prototype对象中的sayHello方法。这是因为person1和person2都是Person构造函数的实例对象,而Person.prototype对象是Person构造函数的原型对象。
总结:深入理解对象创建与继承
构造函数、原型和原型链是JavaScript中理解对象创建和继承的关键概念。通过构造函数我们可以创建对象,通过原型对象我们可以为对象添加属性和方法,通过原型链我们可以实现对象的继承。