青少年编程与数学 01-007 在网页上编写程序 15课题、属性和方法4_4
本文探讨了JavaScript中的属性和方法,属性是对象状态的表示,分为数据属性和访问器属性,可通过点符号或方括号语法访问和设置。数据属性包含实际值,访问器属性则包含getter和setter函数。属性具有可枚举性、可配置性和可写性等属性描述符,可通过Object.defineProperty等方法设置。方法则是对象的行为,可以是内置的或用户自定义的,通过对象调用执行特定任务。内置对象如String、Array、Date提供了丰富的方法,用户也可以在自定义对象上定义方法。方法的调用、参数传递、返回值以及作用域中的this关键字的使用都是JavaScript编程中的关键概念。
九、属性和方法的理解
(二)宠物猫
当然可以!使用宠物猫作为示例,我们可以非常直观地理解面向对象编程中的属性和方法概念。让我们来看一下如何基于宠物猫来设计一个简单的类。
宠物猫的属性(Attributes)
一只宠物猫可能有以下属性:
- 名字(Name): 猫的名字。
- 年龄(Age): 猫的年龄。
- 颜色(Color): 猫毛的颜色。
- 体重(Weight): 猫的体重。
- 是否饥饿(IsHungry): 布尔值,表示猫是否感到饥饿。
这些属性描述了猫的基本状态和信息。
宠物猫的方法(Methods)
宠物猫能够执行一些动作或行为,这些就是它的方法:
- 喵喵叫(Meow): 猫发出叫声。
- 吃东西(Eat): 猫吃食物,如果它饿的话。
- 玩耍(Play): 猫与玩具或主人玩耍。
- 睡觉(Sleep): 猫休息或睡觉。
这些方法描述了猫的行为和功能。
代码示例
下面是一个使用Python编写的简单Cat
类的示例,它包含了上述属性和方法:
class Cat:
def __init__(self, name, age, color, weight):
self.name = name # 属性:名字
self.age = age # 属性:年龄
self.color = color # 属性:颜色
self.weight = weight # 属性:体重
self.is_hungry = True # 属性:是否饥饿,默认为真
def meow(self): # 方法:喵喵叫
print(f"{self.name} says: Meow!")
def eat(self): # 方法:吃东西
if self.is_hungry:
print(f"{self.name} is eating.")
self.is_hungry = False
else:
print(f"{self.name} is not hungry.")
def play(self): # 方法:玩耍
print(f"{self.name} is playing.")
def sleep(self): # 方法:睡觉
print(f"{self.name} is sleeping.")
# 创建一个Cat实例
my_cat = Cat("Whiskers", 3, "orange", 5.5)
# 调用方法
my_cat.meow()
my_cat.eat()
my_cat.play()
my_cat.sleep()
在这个例子中,Cat
类的属性如name
、age
等描述了猫的特征,而方法如meow
、eat
等描述了猫可以执行的动作。当我们创建一个Cat
对象并调用其方法时,对象会表现出相应的行为,这正是面向对象编程的核心思想。
(三)汽车
当然,让我们通过一个现实世界中的例子——一辆汽车——来形象地说明属性和方法的概念。
属性(Attributes)
假设你有一辆汽车。这辆汽车有一些固有的特性,这些特性并不随时间或操作而改变,我们称之为属性。比如:
- 颜色(Color): 汽车的外观颜色,例如红色、蓝色等。
- 品牌(Brand): 制造商的品牌,例如丰田(Toyota)、宝马(BMW)等。
- 燃油量(Fuel Level): 油箱里的油量,通常以升或加仑为单位。
- 里程表读数(Odometer Reading): 汽车行驶的总距离,以公里或英里为单位。
这些属性描述了汽车的状态或特征。
方法(Methods)
汽车除了有属性外,还能执行一些操作或功能,我们称之为方法。例如:
- 启动(Start): 发动引擎,使汽车准备好行驶。
- 停止(Stop): 关闭引擎,使汽车停止。
- 加速(Accelerate): 增加速度,让汽车更快地前进。
- 减速(Decelerate): 减少速度,让汽车慢下来。
- 转向(Steer): 控制方向,使汽车向左或向右转弯。
这些方法描述了汽车能够执行的动作。
对比与联系
在面向对象的编程中,对象就像是现实世界中的实体,如上述的汽车。属性类似于实体的静态描述,而方法则是实体可以执行的动态操作。
例如,在JavaScript中,如果我们创建一个代表汽车的类(Car
),它可能看起来像这样:
class Car {
constructor(color, brand, fuelLevel, odometerReading) {
this.color = color; // 属性:颜色
this.brand = brand; // 属性:品牌
this.fuelLevel = fuelLevel; // 属性:燃油量
this.odometerReading = odometerReading; // 属性:里程表读数
}
start() { // 方法:启动
console.log("Engine started.");
}
stop() { // 方法:停止
console.log("Engine stopped.");
}
accelerate() { // 方法:加速
console.log("Speeding up.");
}
decelerate() { // 方法:减速
console.log("Slowing down.");
}
steer(direction) { // 方法:转向
console.log(`Steering ${direction}.`);
}
}
在这个例子中,Car
类的属性如color
、brand
等描述了汽车的特征,而方法如start
、stop
等描述了汽车可以执行的操作。
希望这个例子能帮助初学者更好地理解属性和方法的概念!
十、练习
下面是一个综合示例,展示了在JavaScript中如何定义和使用不同类型的属性,包括数据属性、访问器属性,以及如何利用属性描述符来控制属性的行为。我们将创建一个Person
类,它将拥有姓名、年龄和生日等属性,并演示如何使用ES6类语法和属性描述符。
// 引入Date对象,虽然这里不需要显式导入,因为它是全局对象
const Date = global.Date;
class Person {
constructor(name, age) {
// 数据属性:姓名和年龄
this._name = name;
this._age = age;
// 数据属性:生日,初始化为当前日期
this.birthday = new Date();
}
// 数据属性的getter和setter
get name() {
return this._name;
}
set name(newName) {
if (typeof newName === 'string' && newName.length > 0) {
this._name = newName;
} else {
throw new Error('Name must be a non-empty string.');
}
}
get age() {
return this._age;
}
set age(newAge) {
if (typeof newAge === 'number' && newAge >= 0) {
this._age = newAge;
} else {
throw new Error('Age must be a non-negative number.');
}
}
// 计算属性:完整年龄
get fullAge() {
const currentYear = new Date().getFullYear();
const birthYear = this.birthday.getFullYear();
return currentYear - birthYear;
}
// 方法:问候
greet() {
console.log(`Hello, my name is ${this.name} and I am ${this.fullAge} years old.`);
}
}
// 创建一个Person实例
const person = new Person('John Doe', 30);
// 访问属性
console.log(person.name); // John Doe
console.log(person.age); // 30
console.log(person.fullAge); // 假设当前年份是2024,则会输出34(2024 - 1990)
// 设置属性
person.name = 'Jane Doe';
person.age = 28;
// 再次访问属性
console.log(person.name); // Jane Doe
console.log(person.age); // 28
// 调用方法
person.greet(); // Hello, my name is Jane Doe and I am 34 years old.
在这个示例中,我们定义了一个Person
类,其中包含了数据属性、访问器属性和一个计算属性。我们还定义了一个方法greet
来展示如何在方法中使用这些属性。这个示例展示了如何在JavaScript中使用不同的属性类型以及如何通过属性描述符控制属性的读写行为。
课题作业
所有作业均包括文档中代码的练习,不再列入作业正文中。
- 创建对象实例:定义一个对象
myCar
,它是一个汽车,具有以下属性:品牌(brand),颜色(color),燃油量(fuelLevel),里程数(mileage)。 - 使用现有属性:使用点符号(.)和方括号([])语法访问
myCar
对象的属性。 - 调用方法:使用
myCar
对象的现有方法,如start()
启动汽车,stop()
停止汽车。如果不存在,则简单打印出相应的动作描述。 - 属性修改:编写一个函数
refuel(car, amount)
,该函数接受汽车对象和加油量作为参数,增加汽车的燃油量。 - 方法调用:编写一个函数
drive(car, distance)
,接受汽车对象和行驶距离作为参数,打印出发行驶动,并更新里程数。如果燃油量不足以支持行驶距离,打印出需要加油的消息。 - 使用数组方法:如果
myCar
对象有一个trips
数组,记录每次行驶的详细信息,使用数组的方法如push()
添加一条新的行驶记录。 - 字符串方法应用:使用字符串方法修改
myCar
的品牌名称,例如转换为大写或小写。 - 遍历对象属性:使用
for...in
循环遍历并打印myCar
对象的所有属性和它们的值。 - 使用Date对象:使用
Date
对象获取当前日期,并打印出来。
附录一、中国科学院下属研究机构
中国科学院(Chinese Academy of Sciences,简称CAS)是中国最高学术机构和综合性研究与发展中心,拥有众多下属研究机构,分布在全国各地。以下是一些中国科学院的主要下属研究机构:
-
中国科学院数学与系统科学研究院 - 专注于数学和系统科学的基础研究。
-
中国科学院物理研究所 - 从事物理学各分支领域的研究。
-
中国科学院化学研究所 - 化学领域的综合性研究机构。
-
中国科学院高能物理研究所 - 从事高能物理、粒子物理和宇宙学等领域的研究。
-
中国科学院力学研究所 - 力学及相关领域的基础和应用研究。
-
中国科学院地球化学研究所 - 地球化学和比较行星学的研究。
-
中国科学院地质与地球物理研究所 - 地质学和地球物理学的研究机构。
-
中国科学院大气物理研究所 - 大气科学领域的研究。
-
中国科学院植物研究所 - 植物学领域的综合性研究机构。
-
中国科学院动物研究所 - 动物学领域的研究。
-
中国科学院微生物研究所 - 微生物学领域的研究。
-
中国科学院生物物理研究所 - 生物物理学的基础和应用研究。
-
中国科学院上海生命科学研究院 - 生命科学的基础研究。
-
中国科学院计算技术研究所 - 计算机科学与技术领域的研究。
-
中国科学院自动化研究所 - 自动化和智能科学领域的研究。
-
中国科学院软件研究所 - 软件科学和技术的研究。
-
中国科学院半导体研究所 - 半导体科学和技术的研究。
-
中国科学院长春光学精密机械与物理研究所 - 光学和精密机械领域的研究。
-
中国科学院上海硅酸盐研究所 - 硅酸盐科学和技术的研究。
-
中国科学院自然科学史研究所 - 自然科学史和科技政策的研究。
此外,中国科学院还有许多其他研究所和研究中心,涵盖了从基础科学研究到应用技术开发的各个领域。请注意,上述列表并不全面,中科院的研究机构数量众多,且随着科研发展,新的研究所和中心可能会成立。