JS 没有“类”(class),通过“构造函数”来实现
JS 是基于“原型继承”实现面对对象编程
- 属性:实例(对象):声明在构造方法中
- 方法:实例共享:声明在原型(prototype)
- 静态:函数(类)访问:直接挂载到构造方法中
const fn = function () { }console.log(typeof fn)//instanceof:判断某个对象是否是某个类的实例console.log(fn instanceof Object)//true ,函数也是对象,是对象的一种fn.site = 'php.cn'fn.hello = function () {return 'Hello ' + this.site}console.log(fn.site)console.log(fn.hello())console.log('------------------')//任何函数都有一个“原型”属性,是一个对象{}console.log(fn.prototype, typeof fn.prototype)//JS是基于原型实现继承,所以原型对象上的成员可以被所有类实例共享console.log('------------------')
专用于创建对象(实例)
1.函数名首字母应该大写(大驼峰):行为规范请遵守
2.禁止用箭头函数声明:箭头函数没有自己的this
let User = function (uname, email) {//创建新对象,JS自动完成//let this = new User()//添加新对象//(1)属性this.uname = unamethis.email = email//返回this,JS自动完成//return this}// (2) 方法,应该被所有对象所共享,prototypeUser.prototype.say = function () {return `${this.uname}:${this.email}`}//(3)静态成员User.nation = 'CHINA'
//new:控制函数内部的this指向,指向当前对象,否则全局const user = new User('老马', 'nx99@qq.com')// 1. 访问属性console.log(user.uname, user.email)console.table(user)// 2. 访问方法/*** * 原型属性(prototype)* * 任何函数都有原型属性:`prototype`* * 原型属性仍然是一个对象* * 声明在原型中的成员,被全部实例共享*/console.log(user.say())//new classconst user1 = new User('admin', 'admin@qq.com')console.log(user1.say())// 3. 访问静态成员,不需要实例化console.log(User.nation)
//子类,它是User类的子类//这里的: “类” === “构造函数”//SEX是子类独有的,扩展了父类功能const Child = function (uname, email, sex) {//继承父类return new User(uname, email)}//当前类继承了UserChild.prototype = User.prototypeconst child = new Child('小龙女', 'xln@qq.com')console.table(child)console.log(child.say())
let User = class {//构造函数:(1)声明属性constructor(uname, email) {this.uname = unamethis.email = email}//(2)方法say() {return `${this.uname}:${this.email}`}//(3) 静态属性static nation = 'CHINA'}
const user = new User('小龙女', 'xlv@qq.com')console.log(user.say())console.table(user)console.log(User.nation)console.log('---------继承----------')
class Child extends User {constructor(uname, email, sex) {//super 调用父类成员super(uname, email)//子类扩展类型this.sex = sex}say() {//super.say()调用 父类中的say()return `${super.say()},${this.sex}`}}const child = new Child('杨过', 'nx33@qq.com', '女')console.table(child)
console.log('---------访问器属性----------')const Stu = class {//私有属性:在属性前加 ##age = 18//访问器属性//1. 读:获取器get age() {return this.#age}//2. 写:设置器set age(age) {if (age >= 18 && age <= 100) {this.#age = age} else {console.log('年龄必须在:18-100岁之间!')}}}let stu = new Stu()console.log('age = ',stu.age)stu.age=30console.log('age = ',stu.age)
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号