Javascript借用原型对象继承父类型方法

简介: Javascript借用原型对象继承父类型方法

借用原型对象继承父类型方法

目的: 儿子继承父类属性和方法,父类之后新增的方法不会被儿子继承。


前言:


先理解一个问题:


Son.prototype = Father.prototype; 这一操作相当于把Son的原型对象指向Father。


意味着Son的prototype的地址与Father一致,如果我给Son新增函数,那么Father也会同步新增。

8ae32115314e42acb670a03c00a584f1.png

具体代码:

function Father(uname, age) {
    this.uname = uname;
    this.age = age;
}
Father.prototype.money = function() {
    console.log(100000);
};
function Son(uname, age, score) {
    Father.call(this, uname, age);
    this.score = score;
}
Son.prototype = Father.prototype;
let son = new Son('刘德华', 18, 100);
console.log(Son.prototype);
console.log(Father.prototype);

结果:

34058bc837e64171a647be776f95a23e.png

分析:


我们的初衷是,儿子继承父类属性和方法,父类之后新增的方法不会被儿子继承。


很明显儿子和父亲的成员函数和属性都一致,这是由于儿子和父类地址一致导致的。


解决方案:


Son.prototype = new Father();


首先用new创建一个父类的实例对象,然后让Son的原型对象指向这个新创建的对象即可。

bf5f5f6c3ecc4ac5b9d3f11a94941a64.png

从下往上理解:


Son原型对象:指向Father实例对象,继承Father实例对象的属性和方法


Father实例对象:含有__proto__属性,可以使用Father原型对象的新增的方法


Father原型对象:可以新增函数


此时,如果Son新增函数,由于Son和Father实例对象地址一致,只会影响到Father实例对象,而不会影响到Father原型对象上。


总结:


将子类所共享的方法提取出来,让子类的 prototype 原型对象 = new 父类()


通过父类实例化对象,开辟额外空间,就不会影响原来父类的原型对象。


有一说一,采用了深拷贝的思想。


Code:

// 借用父构造函数继承属性
// 1. 父构造函数
function Father(uname, age) {
    // this 指向父构造函数的对象实例
    this.uname = uname;
    this.age = age;
}
Father.prototype.money = function() {
    console.log(100000);
};
// 2 .子构造函数 
function Son(uname, age, score) {
    // this 指向子构造函数的对象实例
    Father.call(this, uname, age);
    this.score = score;
}
// Son.prototype = Father.prototype;  这样直接赋值会有问题,如果修改了子原型对象,父原型对象也会跟着一起变化
Son.prototype = new Father();
// 如果利用对象的形式修改了原型对象,别忘了利用constructor 指回原来的构造函数
Son.prototype.constructor = Son;
// 这个是子构造函数专门的方法
Son.prototype.exam = function() {
    console.log('孩子要考试');
}
var son = new Son('刘德华', 18, 100);
console.log(son);
console.log(Father.prototype);
console.log(Son.prototype.constructor);

参考:


可以看这两集


https://www.bilibili.com/video/BV1DY41177dM?p=37&spm_id_from=pageDriver&vd_source=30a98e03cd5a7bbfaeb4416fc48542e2


相关文章
|
6天前
|
JavaScript 前端开发
如何在 JavaScript 中使用 __proto__ 实现对象的继承?
使用`__proto__`实现对象继承时需要注意原型链的完整性和属性方法的正确继承,避免出现意外的行为和错误。同时,在现代JavaScript中,也可以使用`class`和`extends`关键字来实现更简洁和直观的继承语法,但理解基于`__proto__`的继承方式对于深入理解JavaScript的面向对象编程和原型链机制仍然具有重要意义。
|
10天前
|
Web App开发 JavaScript 前端开发
如何确保 Math 对象的方法在不同的 JavaScript 环境中具有一致的精度?
【10月更文挑战第29天】通过遵循标准和最佳实践、采用固定精度计算、进行全面的测试与验证、避免隐式类型转换以及持续关注和更新等方法,可以在很大程度上确保Math对象的方法在不同的JavaScript环境中具有一致的精度,从而提高代码的可靠性和可移植性。
|
9天前
|
JavaScript 前端开发 索引
js中DOM的基础方法
【10月更文挑战第31天】这些DOM基础方法是操作网页文档结构和实现交互效果的重要工具,通过它们可以动态地改变页面的内容、样式和行为,为用户提供丰富的交互体验。
|
9天前
|
缓存 JavaScript UED
js中BOM中的方法
【10月更文挑战第31天】
|
9天前
|
JavaScript 前端开发
.js方法参数argument
【10月更文挑战第26天】`arguments` 对象为JavaScript函数提供了一种灵活处理参数的方式,能够满足各种不同的参数传递和处理需求,在实际开发中具有广泛的应用价值。
25 7
|
9天前
|
JavaScript 前端开发 Java
除了 JavaScript,还有哪些编程语言支持 Set 类型
【10月更文挑战第30天】这些编程语言中的 `Set` 类型虽然在语法和具体实现细节上有所不同,但都提供了类似的集合操作功能,方便开发者在不同的编程场景中处理集合相关的数据和逻辑。
|
9天前
|
JavaScript 前端开发
如何使用原型链继承实现 JavaScript 继承?
【10月更文挑战第22天】使用原型链继承可以实现JavaScript中的继承关系,但需要注意其共享性、查找效率以及参数传递等问题,根据具体的应用场景合理地选择和使用继承方式,以满足代码的复用性和可维护性要求。
|
9天前
|
JavaScript 前端开发 开发者
js实现继承怎么实现
【10月更文挑战第26天】每种方式都有其优缺点和适用场景,开发者可以根据具体的需求和项目情况选择合适的继承方式来实现代码的复用和扩展。
23 1
|
10天前
|
JavaScript 前端开发 图形学
JavaScript 中 Math 对象常用方法
【10月更文挑战第29天】JavaScript中的Math对象提供了丰富多样的数学方法,涵盖了基本数学运算、幂运算、开方、随机数生成、极值获取以及三角函数等多个方面,为各种数学相关的计算和处理提供了强大的支持,是JavaScript编程中不可或缺的一部分。
|
10天前
|
JavaScript 前端开发 开发者