javascript面向对象

 官方文档:https://javascript.info/document

目录

什么是对象?

类属性和方法

(1)类方法

(2)继承,使用extend

(3)调用父类

构造函数

(1)继承

(2)特性

prototype(原型)

(1)基本使用

(2)构建实例方法

constructor(构造)

什么是对象?

对象其实是一个抽象概念的具体实例。任何整体都能看做对象,像猫,老鼠,狗。猫是一个对象,狗也是一个对象,猫和狗不是同一个对象。有了对象,相当于有了模板,將不同的事物进行分开,能减少代码量。它包括三个主要概念: 类与实例继承封装

类属性和方法

(1)类方法

实例化方法使用前类必须实例化,调用静态方法,直接用类名调用,不能实例化

/*  首字母都要大写 */
class Zhang {
        //构造方法, 相当于python的初始化方法,定义属性
        constructor(age){
            //属性age
            this.age= age;
        }
        //自定义方法getName,遵照驼峰命名法,实例化方法使用前必须实例化
        getAge(){
            return this.age;
        }
        //静态方法
        //函数名前加上static
        static yi(a1){
        // ``可以在里面写变量
            return `${a1},大笨蛋`;
        }
    }

// 初始化
a = new Zhang(21)
console.log(a.getAge())

// 调用静态方法,直接用类名调用,不能实例化
console.log(Zhang.yi('hhhhh,你输了'))


(2)继承,使用extend

class Zhang {
    //构造方法, 相当于python的初始化方法,定义属性
    constructor(age){
          //属性age
          this.age= age;
    }
    //自定义方法getName,遵照驼峰命名法
    getAge(){
          return this.age;
    }
}

// 使用extends 关键字
class Huang extends Zhang {
    constructor(name) {
        this.name = name;
   };
 }

(3)调用父类

/*  首字母都要大写 */
class Zhang {
    //构造方法, 相当于python的初始化方法,定义属性
    constructor(age) {
        //属性age
        this.age = age;
    }

    //自定义方法getName,遵照驼峰命名法
    getAge() {
        return this.age;
    }
}
class Huang extends Zhang {
    constructor(name) {
        super(22); // 继承Zhang的属性
        this.name = name;
    };
    //继承方法
    a () {
        return super.getAge()
    };
}
var aa = new Zhang(18);
var bb = new Huang('zhang');

console.log(bb.a());  // 18

构造函数

(1)继承

/*  1. 继承  */
        //父
        var Parent = function () {
            console.log('我是父亲')
        }

        var p = new Parent();
        Parent.prototype.add1 = function () {
            console.log('增加的第一个扩展')
        };
        Parent.prototype.add2 = function () {
            console.log('增加的第二个扩展')
        }


        //子
        var Child = function () {
            // 不用实例化调用父类的方法
            Parent.call(this)
        }
        var c = new Child();
        //继承父,不能通过类去继承,通过原型去继承
        for (var i in Parent.prototype) {
            Child.prototype[i] = Parent.prototype[i]
        }

        c.add1()
        c.add2 = function () {
            console.log('儿子,自己的')
        }
        // 如果子对象创建自己的函数,则会覆盖继承的
        c.add2()


(2)特性

可以得到函数内部的属性,在函数内部也能定义方法

//方式1,函数名首字母大写
function People(){
  // 使用this关键字,代表实例化属性
   this.name = 'zhang'
}

// 实例化对象
p = new People()
console.log(p.name)

//方式2,函数名不用大写
var people1 = function () {
   this.aa = 1
}

//实例化前要加new
var p1 = new people1();


// 打印aa属性
console.log(p1.aa)

prototype(原型)

(1)基本使用

注意:使用原型时,需使用函数原名,不能使用实例化后的名称

//方式2,函数名不用大写
var people1 = function () {
   this.aa = 1
}

// 对于函数,共享数据使用prototype,所有实例化函数都能得到此数据
p1.bb = '我是p1.aa'
p2 = new people1();

console.log(p2.bb) // 不能得到 undefined
//使用prototype, p1,p2能够得到bb,相当于扩展原函数
people1.prototype.bb = '我是p1.aa'

console.log(p2.bb) // 我是p1.aa
console.log(p1.bb)

(2)构建实例方法

people1.prototype.sayHello = function (name) {
    this.name = name
    console.log('Hello,'+ this.name)
}

// 不能使用函数名调用
// people1.sayHello()  报错
// 能使用实例化:var p2 = new people1();
p2.sayHello('zhang')

//2. 不使用prototype,就称为静态方法
people1.sayHello1 = function (name) {
    // 不能写name,不然会得到函数名
    this.name1 = name
    console.log('Hi,'+ this.name1)
}

//可以直接使用函数名调用
people1.sayHello1('yi')

constructor(构造)


用来得到实例对象前的原型, 比如写了一个AI大模型接口,对外提供的时实例化后的对象.用constructor可以得到对象原型,去扩展原对象

// 声明全局变量
var AI;
//自动执行函数,相当于封装
(
    function () {
        // 别人提供的ai大模型,内部
        var AI_func = function () {
            console.log('我是AI大模型')
        };
        // 对外提供的接口,这里不能用var,不能再次声明变量,不然会覆盖原变量
        AI = new AI_func()
    }
)();


// 3. 访问到原对象,并扩展。这里要是用prototype,因为只用实例化后的对象,不然调用函数时调用不了
AI.constructor.prototype.add_func = function() {
    console.log('我是AI大模型的add_func')
}
AI.add_func() // 我是AI大模型的add_func

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值