关于JavaScript高级程序设计中的扩展——动态原型,我来详细解释一下。
动态原型
JavaScript 是一门基于原型继承的语言,原型链决定了对象如何继承属性和方法。原型是 JavaScript 对象中一个非常重要的概念,用于实现对象的继承,从而节省大量的代码。
动态原型模式是一种在同时使用构造函数和原型的情况下,可以向原型中添加方法的方法。如下所示:
function Person(name, age, job){
this.name = name;
this.age = age;
this.job = job;
if(typeof this.sayName != "function"){
Person.prototype.sayName = function(){
console.log(this.name);
};
}
}
上述代码中,我们创建了一个 Person 构造函数。在构造函数中使用服夹 if(typeof this.sayName != "function") 的代码,可以实现当使用 new 操作符创建对象的时候,仅在第一次调用构造函数的时候,才会执行 if 语句块内的代码。之后就不会再执行了,因为 sayName 属性已经被添加到了原型中,所以每个实例都可以调用它。
示例说明
示例一
现有一个 Student 函数构造器(class 类型),格式如下:
class Student {
constructor(name, age) {
this.name = name
this.age = age
}
}
现在需要向 Student 的原型中动态地添加一个 sayHello 方法,输出 "Hello, I am name,age years old"。
class Student {
constructor(name, age) {
this.name = name;
this.age = age;
if (typeof this.sayHello != "function") {
Student.prototype.sayHello = function () {
console.log(`Hello, I am ${this.name}, ${this.age} years old.`)
};
}
}
}
const s = new Student('Lucy', 18);
s.sayHello(); // 输出 "Hello, I am Lucy, 18 years old."
在 Student 构造函数中,添加了判断,“如果 typeof this.sayHello 不是一个函数,则给 Student 的原型添加一个属性。这样就可以确保每个实例都只会动态添加一次 sayHello 方法。在 s.sayHello() 的时候,输出 "Hello, I am Lucy, 18 years old."。
示例二
现有一个 Car 函数构造器,为汽车类,其中默认有车牌号和座位数。现在需要添加一个动态的方法 park,用于停放汽车时输出 "The car of plate number is parked in the yard"。
function Car(licensePlateNumber, seatNumber) {
this.licensePlateNumber = licensePlateNumber
this.seatNumber = seatNumber
if (typeof this.park != "function") {
Car.prototype.park = function () {
console.log(`The car of ${this.licensePlateNumber} is parked in the yard.`);
};
}
}
在 Car 构造函数中,添加了判断,“如果 typeof this.park 不是一个函数,则给 Car 的原型添加一个 park() 方法。这样就可以确保每个实例都只会动态添加一次 park 方法。在 c.park() 的时候,输出 "The car of MN37C8 is parked in the yard."。
const c = new Car('MN37C8', '5');
c.park(); // 输出 "The car of MN37C8 is parked in the yard."
以上是关于动态原型的详细说明,希望对你有所帮助。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:JavaScript高级程序设计 扩展–关于动态原型 - Python技术站