面向对象基本特征
封装:
也就是把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏。
继承:
通过继承创建的新类称为“子类”或“派生类”。继承的过程,就是从一般到特殊的过程。
多态:
对象的多功能,多方法,一个方法多种表现形式。
Javascript是一种基于对象(object-based)的语言。
面向对象原型模式
<script>
function Person(nickname) {
this.nickname = nickname;
}
let person = new Person('海贼王');
console.log(person);
console.log(person.nickname);
person.nickname = '路飞';
console.log(person);
console.log(person.nickname);
Person.prototype.eat = function (food) {
console.log(this.nickname + '吃' + food);
}
person.eat('肉');
function Man(nickname, age) {
//继承
Person.call(this, nickname);
this.age = age;
}
Man.prototype = new Person();
Man.prototype.constructor = Man;
let man = new Man('路飞', 20);
console.log(man);
console.log(man.nickname);
console.log(man.age);
man.eat('肉');
</script>
面向对象写法
<script>
class Person {
// 创建构造方法
constructor(gender, age) {
this.gender = gender;
this.age = age;
}
// 创建类方法
static haha() {
console.log('onepiece');
}
// 创建实例方法
eat(food) {
console.log(`吃${food}`);
}
}
// 调用类方法
Person.haha();
// 创建对象 注意 对象不能通过对象名点的方式调用类方法
let person01 = new Person(1, 23);
console.log(person01);
console.log(person01.gender);
console.log(person01.age);
person01.eat('肉');
person01.age = 25;
person01.gender = 1;
console.log(person01);
console.log(person01.gender);
console.log(person01.age);
person01.heihei = function () {
console.log('bleach');
}
person01.heihei();
Person.hehe = function () {
console.log('onepiece');
}
Person.hehe();
// 继承
class Man extends Person {
constructor(gender, age, nickname) {
super(gender, age);
this.nickname = nickname;
}
work() {
console.log('寻找宝藏');
};
eat(food) {
console.log(this.nickname + '吃' + food);
}
}
let man = new Man(1, 20, '路飞');
man.work();
man.eat('肉');
class Woman extends Person {
constructor(gender, age, nickname) {
super(gender, age);
this.nickname = nickname;
}
// 方法重写
eat(food) {
console.log(this.nickname + '吃' + food);
}
}
let woman = new Woman(0, 18, '娜美');
console.log(woman);
woman.eat('荔枝');
</script>
类变量与私有属性,公有属性
<script>
class Person {
//类变量是属于一个类的变量。就像java里用static修饰的变量。因为它属于类,所以它也应该是一个常量。
static slogan = 'onepiece';
// 私有属性 对象的属性不能被访问者看到;只能在函数内部使用。好处就是安全,就类似闭包中的函数一样,减少污染。
#food = '肉';
#flower;
// 公有属性 当我们定义一个对象后,使用对象的人在实例化之后可以访问到对象内部的属性。
nickname = '路飞';
eat(food) {
console.log(this.nickname + '吃' + this.#food);
}
set flower(flower) {
console.log('set');
this.#flower = flower;
}
get flower() {
console.log('get');
return this.#flower
}
}
console.log(Person.slogan);
let person = new Person();
console.log(person);
person.eat();
person.nickname = '索隆';
person.food = '龙肉';
console.log(person.food);
person.eat();
console.log(person);
person.flower = '橡胶';
console.log(person.flower);
person.flower = '香蕉';
console.log(person.flower);
</script>
简化面向对象写法
<script>
let person = {
nickname: '路飞',
gender: 1,
age: 20,
eat: function (food) {
console.log(this.nickname + '吃' + food);
},
work: () => {
console.log(this.nickname + '寻找宝藏');
}
}
console.log(person);
person.eat('龙肉');
person.work();
</script>