那么我们先来简单介绍一下prototype和proto的概念。
在JavaScript中,每个对象都有一个proto属性,它指向该对象的原型。而原型又拥有一个prototype属性,它指向该原型的构造函数的原型。这里可能有些晦涩难懂,接下来我们通过例子来更详细地解释。
假设我们有如下的一个构造函数:
function Person(name) {
this.name = name;
}
var person1 = new Person('Li Lei');
var person2 = new Person('Han Meimei');
那么,person1和person2就是两个Person的实例对象,它们共享Person的原型。也就是说,person1.proto === Person.prototype,并且person2.proto === Person.prototype。
接下来我们为Person的原型添加一个sayHello方法:
Person.prototype.sayHello = function() {
console.log('Hello, my name is ' + this.name + '!');
}
现在,无论是person1还是person2,它们都可以调用该方法:
person1.sayHello(); // Hello, my name is Li Lei!
person2.sayHello(); // Hello, my name is Han Meimei!
这是因为在调用person1.sayHello()时,JavaScript首先在person1这个对象中查找是否有该方法,如果没有,它就会在person1.__proto__所指向的Person.prototype中查找,最终找到了sayHello方法并调用了它。
另外一个例子是,我们还可以利用原型链的特性来继承某个对象的属性和方法,例如:
function Student(name) {
Person.call(this, name);
this.grade = 'A';
}
Student.prototype = Object.create(Person.prototype);
Student.prototype.constructor = Student;
var student1 = new Student('Tom');
student1.sayHello(); // Hello, my name is Tom!
console.log(student1.grade); // 'A'
这里我们创建了一个Student构造函数,并使它继承了Person构造函数的属性和方法。为了实现继承,我们需要将Student.prototype设置为一个Person的实例对象,并将Person.call(this, name)用来实现一些自定义的初始化操作。
通过这两个例子,我们可以更好地理解prototype和proto之间的关系了,也知道了原型链是如何实现对象属性和方法的继承的。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:深入浅析JavaScript中prototype和proto的关系 - Python技术站