DAY30-class

本文介绍了JavaScript中的类定义,包括构造函数用于对象实例化,以及属性的getter和setter方法在对象属性读取和设置时的作用。示例代码展示了如何创建类、实例化对象以及使用getter和setter处理属性操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

class Car {
	// 构造函数 - (工厂中接头人)
	// 实例化 - (造车的过程) => 类创建对象(实例)的过程

	// whell = 4;

	constructor(wheel, color, length, width) {
		this.whell = wheel;
		this.color = color;
		this.length = length;
		this.width = width;

		this.speed = 0;
	}

	// 加速
	speedUp() {
		this.speed += 1;
	}
}

const car1 = new Car(3, '#f00', 20, 40);
const car2 = new Car(33, '#ff0', 88, 99);

console.log(car1, car2);

`class` 关键字定义了一个名为 `Car` 的类,在该类中,定义了一个 `constructor()` 构造函数,这个构造函数在类实例化时会被自动调用。构造函数的参数为 `wheel`(轮子数)、`color`(汽车颜色)、`length`(汽车长度)和 `width`(汽车宽度),这些参数会被存储在该类的实例(即被创建出来的对象)中。

在该类中,还定义了一个 `speedUp()` 方法,该方法用于增加车速。

代码的最后,通过 `new` 运算符将 `Car` 类创建了两个实例,分别为 `car1` 和 `car2`,它们的属性值与在创建类实例时传入的参数相对应。这些对象被打印到了控制台,以便查看它们的属性和值。

const obj = {
 	name: '',

 	get name() {
 		console.log('123');
 		return this.name;
 	},

 	set name(val) {
 		this._name = val;
 	
 }

 obj.name;

这段代码定义了一个对象obj,其中包含一个属性name和两个方法get name 和 set name。

当执行obj.name时,由于name属性的getter方法get name中包含console.log('123'),因此会在控制台输出123。然而,get name方法中又尝试获取name属性的值,这会导致死循环,并在一定次数后抛出"Maximum call stack size exceeded"异常。

get和set在这段代码中的作用?

在这段代码中,get和set是JavaScript中属性访问器(Property Accessors)的方法名,它们分别用于获取和设置对象的属性。

在这段代码中,obj对象中的name属性同时定义了getter方法和setter方法。当你通过obj.name访问该属性时,JavaScript会自动调用该属性对应的getter方法,并返回该方法的执行结果。同样地,当你给该属性赋值时,JavaScript会自动调用该属性对应的setter方法,并把赋值的值作为参数传入setter方法中进行处理。

get和set可以帮助我们在读取和设置对象的属性时,进行更加灵活的数据处理,从而更好地维护对象的内部状态。

const obj = {
 	_name: '',

 	get name() {
 		console.log('123');
 		return this._name;
 	},

 	set name(val) {
 		this._name = val;
 	}
 }

 obj.name = 222;

这段代码定义了一个对象obj,其中包含了一个属性_name和两个方法get name 和 set name。

当执行obj.name = 222;时,会自动调用obj对象中的set name方法,并将参数222作为参数传入该方法中。在set name方法中,会将传入的参数222赋值给对象的属性_name,进而实现对该属性值的更新。

这段代码并未显式地输出任何值,因此不会在控制台上显示任何输出内容。如果我们在get name方法中增加console.log语句,就可以在控制台中看到输出的内容。例如,如果我们将get name方法修改为:

get name() {
console.log('get name:', this._name);
return this._name;
},

那么在执行obj.name = 222;后,控制台将输出:get name: 222。这表明成功将对象的属性_name的值更新为了222,并可以通过get name方法获取到该属性的当前值。
 

class Person {
 	constructor() {
 		this._name = '';
 	}

 	get name() {
 		console.log('正在访问name');

 		return `我的名字是${ this._name }`;
 	}

 	set name(val) {
 		console.log('正在修改name');

 		this._name = val;
 	}
 }

 const person = new Person();

 person.name = '鸽王';

 console.log(person.name);

这段代码定义了一个Person类,该类中包含了一个私有属性_name 和两个方法get name 和 set name。

在类的构造函数中,我们将私有属性_name初始化为空字符串。在get name方法中,会输出'正在访问name'这段日志,并返回格式化后的字符串`我的名字是${ this._name }`。而在set name方法中,会输出'正在修改name'这段日志,并将传入的参数val赋值给属性_name。

接着我们创建了一个person对象,将该对象的name属性赋值为'鸽王',因此会自动调用set name方法,并将'鸽王'这个字符串作为参数传递进去。在set name方法中,会将_name属性赋值为'鸽王'。

最后,我们输出了person对象的name属性,并在控制台中打印出其返回结果。由于get name方法在访问name属性时输出了日志信息,因此控制台会打印出'正在访问name'这段信息,并输出`我的名字是鸽王`,表明成功获取了该对象的name属性值。

 class AudioPlayer {
 	constructor() {
 		 0 - 暂停 | 1 - 播放 | 2 - 加载中
 		this._status = 0;

 		this.status = 0;

 		this.init();
 	}

 	init() {
 		const audio = new Audio();
 		audio.src = '....';

 		audio.oncanplay = () => {
 			audio.play();
 			this.status = 1;
 		}
 	}

 	get status() {
 		return this._status;
 	}

 	set status(val) {
 		const STATUS_MAP = {
 			0: '暂停',
 			1: '播放',
 			2: '加载中'
 		};

 		document.querySelector('#app .play-btn').innerText = STATUS_MAP[val];
 		this._status = val;
 	}
 }

 const audio = new AudioPlayer();

这段代码定义了一个AudioPlayer类,用于控制web页面上的音频播放器。在类的构造函数中,我们初始化了音频播放器的状态和界面显示,并调用了init方法来初始化音频播放器。 

在init方法中,我们创建了一个new Audio()实例作为音频播放器,并将其src属性指向一个音频资源。当audio.oncanplay(音频数据已经准备好)事件被触发时,我们播放这个音频,并更新播放器的状态(status)为1,即“播放”状态。 

在get status方法中,我们返回状态值_status,该值代表着当前的播放器状态。在set status方法中,我们通过一个常量对象STATUS_MAP将状态值映射为对应的状态文本,并将该文本显示在页面上的play-btn控件上,以便用户了解当前播放器的状态。

最后,在代码的最后,我们创建了一个AudioPlayer类的实例audio来控制我们的音频播放器。

如果没有名字,会取变量的名字 

function Constructor(fn, args) {
	var _this = Object.create(fn.prototype);

	var res = fn.apply(_this, args);

	return res ? res : _this;
}

function Person(name, age) {
	this.name = name;
	this.age = age;
}

Person.prototype.say = function() {
	console.log('我叫' + this.name);
}

var person = Constructor(Person, ['张三', 12]);

console.log(person);

这段代码演示了如何使用 `Constructor` 函数来实例化一个 `Person` 的对象,以及如何访问该对象的属性和方法。

首先定义了一个构造函数 `Person`,接收两个参数 `name` 和 `age`,并将其分别赋值给对象实例的属性 `name` 和 `age` 上。同时,给 `Person.prototype` 添加了一个 `say` 方法,用来输出 `this.name`。

然后调用 `Constructor` 函数,并将 `Person` 函数和 `['张三', 12]` 这两个参数传递给它。`Constructor` 函数会返回一个对象实例 `person`,该实例继承了 `Person.prototype` 上的方法和属性,同时也有自己的 `name` 和 `age` 属性,并且可以使用 `say` 方法。

最后,在控制台输出了这个对象 `person` 的信息,可以看到它的属性和方法都被正确地输出了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值