JavaScript 中的每一个对象都有一个指向另一个对象的内部链接,这个链接称为原型(prototype)链。如果一个对象需要一个属性或者方法,但是它本身并没有这个属性或方法,它会沿着自身的原型链向上查找,直到找到该属性或方法为止。
原型链的概念
每一个 JavaScript 对象在创建时,都会与一个 "原型" 关联起来,这个原型可以是其他的对象的实例,这样,原型对象就会形成一个 "链" 的概念,在查找某个方法或属性时,如果在当前对象上找不到,就会沿着这个原型链一直向上查找,直到找到为止,这就是 "原型链" 的概念。
原型链的创建方式
每一个函数都有一个 prototype 属性,这个属性是一个对象,它的属性和方法会被构造函数的实例继承。如果这些实例都需要初始成员,但又不能使用构造函数中的 this,可以为其添加 prototype 属性。
function Person(name, age){
this.name = name;
this.age = age;
}
Person.prototype.getName = function() {
return this.name;
}
Person.prototype.getAge = function() {
return this.age;
}
原型链的示例
以下是使用原型链的一个示例,我们定义了一个 Person 构造函数,它有一个属性和两个方法。我们可以用 new 关键字创建一个实例,然后使用实例对象直接调用这些方法。
function Person(name, age) {
this.name = name;
this.age = age;
}
Person.prototype.getName = function() {
return this.name;
}
Person.prototype.getAge = function() {
return this.age;
}
const person = new Person('张三', 20);
console.log(person.getName()); // 张三
console.log(person.getAge()); // 20
另一个示例是在一个类的基础上创建一个子类,在子类的构造函数中调用父类的构造函数,并继承父类的原型方法。
function Person(name) {
this.name = name;
}
Person.prototype.getName = function() {
return this.name;
}
function Student(name, id) {
Person.call(this, name);
this.id = id;
}
Student.prototype = Object.create(Person.prototype);
Student.prototype.constructor = Student;
Student.prototype.getId = function() {
return this.id;
};
const student = new Student('李四', 's001');
console.log(student.getName()); // 李四,从 Person 原型中继承下来的方法
console.log(student.getId()); // s001,Student 原型中的方法
在 Student.prototype = Object.create(Person.prototype);
这一行中,我们使用 Object.create
方法创建一个拥有 Person.prototype
属性的新对象,并将这个对象赋值给 Student.prototype
,这样,Student
便继承了 Person
,并且获取了 Person.prototype
上的所有属性和方法,即实现了基于原型的继承。
以上就是原型链的一个详细攻略,希望能对你有所帮助。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:javascript prototype 原型链 - Python技术站