js面向对象三大特征

面向对象三大特征:

一、 封装:隐藏内部的细节,不暴露在外面(不让其它访问仅能自己访问)
//在js中利用函数的作用域来模拟
// 封装
let Pet=function (name,types) {
    this.name=name;
    //封装,将变量用一个关键字声明,这样外面就不能访问了
    let _types=types;
};
//将相同的方法或属性放在原型链上,方便代码的复用
Pet.say=function(){
    return `hello!我叫:${this.name},我是一只可爱的${this._types}`;
};
console.log(Pet.say());//hello!我叫:Pet,我是一只可爱的undefined
二、继承:子类继承父类,就可拥有父类的属性和方法//在js中利用对象冒充(父类构造函数去充当子类的属性)的方式实现继承
//方法1:在js中利用对象冒充(父类构造函数去充当子类的属性)的方式实现继承
//继承
let Pet=function (name,types) {
    this.name=name;
    this.types=types;
};
let Dog=function(name,types,colors,age){
    this.colors=colors;
    this.age=age;

    this.temp=Pet;//将Pet构造函数赋值给temp,充当Dog的子类
    this.temp(name,types);//调用其构造函数并赋值
    delete this.temp;//此时temp已经无用了,将其删除
}
let taidi=new Dog("泰迪","小狗","土其色",2);

console.log(taidi.name+"    "+taidi.types+"    "+taidi.colors+"   "+taidi.age);//泰迪    小狗    土其色   2
//方法2:使用方法借用的方式实现继承
let Pet=function (name,types) {
    this.name=name;
    this.types=types;
};
let Dog=function(name,types,colors,age){
    //借用Pet的方法
    //Pet.apply(this,[name,types]);
    Pet.call(this,name,types);
    this.colors=colors;
    this.age=age;
}
let taidi=new Dog("泰迪","小狗","土其色",2);

console.log(taidi.name+"    "+taidi.types+"    "+taidi.colors+"   "+taidi.age);//泰迪    小狗    土其色   2

//方法3:最终,js采用了原型链继承的方式
//采用了原型链继承的方式
let Pet=function (name,types) {
    this.name=name;
    this.types=types;
};
//给Pet原型链上添加一个方法
Pet.prototype.say=function(){
    return `hello!大家好我是smallzz`;
}

let Dog=function(name,types,colors,age){
    //借用Pet的方法
    //Pet.apply(this,[name,types]);
    Pet.call(this,name,types);
    this.colors=colors;
    this.age=age;
};
//将Pet的构造函数放在Dog的原型链上
Dog.prototype=new Pet();
let taidi=new Dog("泰迪","小狗","土其色",2);

console.log(taidi.name+"    "+taidi.types+"    "+taidi.colors+"   "+taidi.age);//泰迪    小狗    土其色   2
console.log(taidi.say());//hello!大家好我是smallzz

方法4:ES6提供了extends关键字

//使用extends实现继承
class Pet{
    constructor(name,types){
        this.name=name;
        this.types=types;
    }
    say(){
        return `hello!大家好我是smallzz`;
    }
}

class Dog extends Pet{ //继承Pet
    constructor(name,types,colors,age){
        super(name,types);//调用父类的构造器
        this.colors=colors;
        this.age=age;
    }
}

let taidi=new Dog("泰迪","小狗","土其色",3);
console.log(taidi.name+"    "+taidi.types+"    "+taidi.colors+"   "+taidi.age);//泰迪    小狗    土其色   3
console.log(taidi.say());//hello!大家好我是smallzz
三、多态:定义:同一操作用于不同的对象上,会产生不同的结果。js中的对象天生就是多态的

PS:方法借用

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

acqui~Zhang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值