详解Javascript中prototype属性(推荐)
在Javascript中,每个对象都有一个原型(prototype)属性,它指向的是另一个对象,该对象的属性和方法可以被该对象继承。理解原型属性是理解Javascript面向对象编程的关键之一。
介绍prototype属性
Javascript中的函数对象(Function Object)都有一个特殊的属性prototye,它是一个对象,用于存储该函数的实例对象所共享的属性和方法。
我们可以通过以下的方式来创建一个函数:
function Person(name, age) {
this.name = name;
this.age = age;
}
Person.prototype.sayHi = function() {
console.log("Hi, my name is " + this.name);
}
在这个例子中,我们创建了一个Person函数,使用this.name
和this.age
来给实例对象创建属性,然后我们给Person函数的prototype添加了一个叫做sayHi
的方法。
上述代码等同于如下的代码:
function Person(name, age) {
this.name = name;
this.age = age;
this.sayHi = function() {
console.log("Hi, my name is " + this.name);
};
}
但它们有些本质的不同,例如:第一个例子中的sayHi方法是定义在Person的prototype上的,因此所有Person的实例都能够继承它。而第二个例子中的sayHi方法是作为一个实例方法定义在Person函数内部的,因此每创建一个新的实例后,都会在内存中新开辟一块空间存放这个方法的副本.
实际上,通过在prototype上定义方法是一种比将方法通过函数内部定义的方式创建对象更优雅的方法,因为在创建新对象时,不用重复定义它们的实例方法,从而使得代码更加节省。
例如,我们可以创建两个Person对象并输出它们的名字:
var person1 = new Person("John", 20);
var person2 = new Person("Jane", 22);
person1.sayHi(); //输出"Hi, my name is John"
person2.sayHi(); //输出"Hi, my name is Jane"
在上面的例子中,person1和person2都是Person的实例对象,它们都能够调用Person的prototype上的sayHi方法,从而输出各自的名字。
原型的继承
一个对象可以通过指定另一个对象作为它的原型来继承另一个对象的属性和方法。通过这种方式创建的对象,可称之为子类对象。父类对象则称为超类对象。
例如,我们现在要创建一个新的对象Student,使它继承Person的所有属性和方法:
function Student(name, age, major) {
Person.call(this, name, age);
this.major = major;
}
Student.prototype = Object.create(Person.prototype);
Student.prototype.constructor = Student;
Student.prototype.sayMajor = function() {
console.log("My major is " + this.major);
};
在这个例子中,我们首先调用了Person函数,使用call方法指定Person函数内部的this指向当前的Student对象,然后为Student对象创建了自己独有的属性major。接着,我们将Student的prototype指向Person的prototype,并重新设定了constructor属性指向Student。这一步是非常重要的,在prototype的重构过程中,可能会导致constructor属性的丢失。
最后,我们在Student的prototype上定义了一个新的方法sayMajor。这个方法只有子类Student对象才有。
你现在可以创建一个Student对象,并且调用它的方法:
var student1 = new Student("Amy", 19, "Math");
student1.sayHi(); //输出"Hi, my name is Amy"
student1.sayMajor(); //输出"My major is Math"
通过原型链,student1继承了Person的所有属性和方法,同时也拥有了Student的独特方法sayMajor。
结论
在Javascript中,理解原型和原型链是非常重要的。原型是每个对象都拥有的一个特殊属性,用于存储该对象所共享的属性和方法。原型链可以帮助我们实现继承,让一个对象继承另一个对象的所有属性和方法。学会使用原型和原型链可以让我们更加优雅地编写Javascript程序。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:详解Javascript中prototype属性(推荐) - Python技术站