什么是多态?

本文介绍了JavaScript中的多态概念,包括重载和重写,以及如何通过原型对象和构造函数的prototype属性实现对象的继承。着重讲解了如何在对象内部定义和覆盖父对象的方法,以及使用`__proto__`和`Object.setPrototypeOf`进行自定义继承和替换原型。
摘要由CSDN通过智能技术生成

什么是多态?

        同一个函数再不同情况下表现出的不同的状态。

        只要从父对象中继承来的东西(方法和属性)不好用,就可以自己在对象内部定义一个同
        名的成员,覆盖父对象中的成员  此过程称为 重写(override)

        多态包括重载(overload)和重写(override)

function Student(sname,sage){
    this.sname = sname;
    this.sage = sage;
}
var LiLei = new Student("Li Lei",11)
console.log( LiLei.toString() )    //"[object Object]"


function arr(){
    xxxxxxx
}
var arr = [1,2,3,4,5]
console.log( arr.toString() )// "1,2,3,4"


function Date(){
    xxxxxxx
}
var now = new Date()
console.log( now.toString() ) //Mon Mar 16 2024 14:15:33 GMT+0800


var ZhangSan ={
    sname:"Zhang San",
    sage : 20
}
console.log( ZhangSan.toString() )   //"[object Object]"

如何自己定义?

//在原型对象上定义属于自己的方法 并优先使用
Student.proto.toString= function(){
    return `{sanme:"${this.sname}" , sage:"${this.sage}"}`
}
 console.log( LiLei.toString() )   //{sanme:"Li Lei" , sage:"19"}


var ZhangSan ={
    sname:"Zhang San",
    sage : 20
    toString:function(){  //自定义某方法
        return `{sanme:"${this.sname}" , sage:"${this.sage}"}`
    }
}
 console.log( ZhangSan.toString() )   //{sanme:"Zhang San" , sage:"20"}

 自定义继承

        如果一个对象的整个父对象都不好用,就可以更换这个子对象的父对象   

       方法一: 对象._ _ proto _ _ = 新父对象 (有兼容性问题)           
function Student(sname,sage){
    this.sname = sname;
    this.sage = sage
}

var LiLei = new Student("Li Lei",19)
var ZhangSan = new Student("Zhang San",20)
console.log(LiLei ,ZhangSan)


var father={
    money:100000000,
    car:"BMA"
}
//修改父对象
ZhangSan.__proto__=father
console.log(LiLei ,ZhangSan)  // 输出结果如下图所示 只给ZhangSan的原型对象上添加了属性

     

        方法二:Object.setPrototypeOf (子对象,新的父对象)   

        设置子对象的原型为新的父对象

function Student(sname,sage){
    this.sname = sname;
    this.sage = sage
}

var LiLei = new Student("Li Lei",19)
var ZhangSan = new Student("Zhang San",20)
console.log(LiLei ,ZhangSan)

var father={
    money:100000000,
    car:"BMA"
}
//修改父对象
Object.setPrototypeOf(ZhangSan,father)
console.log(LiLei ,ZhangSan)
同时更换多个子对象的共同的父对象 (其实就是修改构造函数)

其实就是修改构造函数的prototype属性指向新的对象
        构造函数.prototype = 新原型对象

一定要找准时机,在创建第一个子对象之前就要更换!

var father={
    money:100000000,
    car:"BMA"
}

function Student(sname,sage){
    this.sname = sname;
    this.sage = sage
}
//修改Student构造函数的原型对象 为father
Student.prototype=father

var LiLei = new Student("Li Lei",19)
var ZhangSan = new Student("Zhang San",20)
console.log(LiLei ,ZhangSan)
console.log(LiLei.money,ZhangSan.money)  // 100000000  100000000  
                                         //因为是修改了原型对象所以他们两个共同修改了该属性
console.log(LiLei.car,ZhangSan.car)      // "BMA" "BMA"

  • 5
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值