1、原型与原型链

1、总结:

  • 原型就是一个对象,每一个对象都有它自己对应的一个原型对象,它可以使用自己原型对象上的所有属性与方法。获取原型的方法有两种,一种是所有数据都有的(__proto__)方法,一种是函数所特有的,通过构造函数的prototype属性方法获取。原型的作用就是来扩展对象,方便继承使用原型的属性和方法,直接调用即可,不用再重新写过。

  • 原型链就是一个对象的原型继承其他对象作为它的原型,因为原型本质是一个对象,所以它可以无限继承原型,就是原型上有原型,原型上还有原型,无限原型,直到最上边的原型( Object原型),这就是原型链的基本概念。具体体现在查找属性/方法中,先查找实例对象的属性/方法,没有找到,然后再往上原型找,没有找到再住上找原型的原型,直到找到Object的原型,都没有找到就返回报错。

2、什么是原型?

  • 原型是一个对象,每一个对象都有它自己对应的一个原型对象(__proto__),它可以使用自己原型对象上的所有属性和方法。

源代码解析:

<script>
	//  1、什么是原型?原型是一个对象
	//  2、每个对象都有它自己对应的一个原型对象(__proto__),它可以使用自己原型对象上的所有属性和方法
	//  3、实例
	//  3.1、创建对象(person)
	let person = { name: 'jasmine' }
	//  3.2、设置对象的原型(person.__proto__),添加age属性和getAge()方法
	person.__proto__.age = 18;
	person.__proto__.getAge = function () { console.log(this.age); }
	//  3.3、对象获取原型的属性和方法
	console.log(person.age);
	person.getAge();
</script>

3、获取原型的方法(2种)

获取原型的方法两种
所有对象都可以获取原型的方法通过对象的(__proto__)获取
函数所特有获取原型的方法通过构造函数的prototype属性获取

源代码解析:

<script>
	//  1、什么是原型?原型是一个对象
	//  2、每个对象都有它自己对应的一个原型对象(__proto__),它可以使用自己原型对象上的所有属性和方法
	//  3、获取原型的第一个方法(__proto__)
	//  3.1、创建对象(person)
	let person = { name: 'jasmine' }
	//  3.2、设置对象的原型(person.__proto__),添加age属性和getAge()方法
	person.__proto__.age = 18;
	person.__proto__.getAge = function () { console.log(this.age); }
	//  3.3、对象获取原型的属性和方法
	console.log(person.age);
	person.getAge();

	//  4、构造函数的this指向谁?指向new创建的对象
	function Person(name, age) {
		this.name = name;
		this.age = age;
	}

	let person1 = new Person('QiQi', 28);
	//  5、获取原型的第二个方法(prototype属性),函数所特有的
	Person.prototype.getAge = function () {
		console.log(this.age);
	}
	person1.getAge();

</script>

4、原型对象的作用

  • 用原型来扩展对象,方便继承使用原型的属性和方法,比如说,我想获取格式化日期,我就可以利用原型方法来获取,方便使用,不用再重新写。

源代码解析:

	//  6、原型对象的作用,用原型来扩展对象,方便继承使用原型的属性和方法
	let date = new Date();
	Date.prototype.formate = function () {
		let year = this.getFullYear();
		let month = this.getMonth() + 1;
		let date = this.getDate();
		return `${year}${month}${date}`;
	}
	console.log(date.formate());

5、什么是原型链

  • 因为原型是一个对象,所以一个对象有原型,而这个原型又可以继承其他对象作为它的原型,原型上有原型,原型上还有原型,无限原型,这就叫原型链。

  • 调用方法:先在对象上找方法,找不到就往原型上找,再找不到就再往上个原型上找,一直住上找,直到找到最上边的(Object)原型为null为止,都找不到就报错。

源代码解析:

//  7、ES5继承(prototype)
	function User(username, password) {
		this.username = username;
		this.password = password;
		this.login = function () {
			console.log('用户登陆')
		}
	}

	function Admin() {
		this.selectUser = function () {
			console.log('查询用户信息');
		}
	}
	/*  8、原型链:因为原型是一个对象,所以一个对象有原型,而这个原型又可以继承其他对象作为它的原型,
	原型上有原型,原型上还有原型,无限原型,这就叫原型链*/
	Admin.prototype = new User();

	/*  9、调用方法:先在对象上找方法,找不到就往原型上找,再找不到就再往上个原型上找,
	一直住上找,直到找到最上边的(Object)原型为null为止,都找不到就报错。*/
	Object.prototype.name = 'Object';
	Object.prototype.login = function () {
		console.log('Object原型上的登陆方法');
	}

	let admin = new Admin();
	admin.login();
	//  10、所有对象的最上边的原型就是(Object)的原型,都可以调用其属性和方法
	let text = {};
	text.login();
	console.log(text.name);

6、源代码:

<!DOCTYPE html>
<html lang="en">

<head>
	<meta charset="UTF-8">
	<meta http-equiv="X-UA-Compatible" content="IE=edge">
	<meta name="viewport" content="width=device-width, initial-scale=1.0">
	<title>原型与原型链</title>
</head>

<body>

</body>
<script>
	//  1、什么是原型?原型是一个对象
	//  2、每个对象都有它自己对应的一个原型对象(__proto__),它可以使用自己原型对象上的所有属性和方法
	//  3、获取原型的第一个方法(__proto__)
	//  3.1、创建对象(person)
	let person = { name: 'jasmine' }
	//  3.2、设置对象的原型(person.__proto__),添加age属性和getAge()方法
	person.__proto__.age = 18;
	person.__proto__.getAge = function () { console.log(this.age); }
	//  3.3、对象获取原型的属性和方法
	console.log(person.age);
	person.getAge();

	//  4、构造函数的this指向谁?指向new创建的对象
	function Person(name, age) {
		this.name = name;
		this.age = age;
	}

	let person1 = new Person('QiQi', 28);
	//  5、获取原型的第二个方法(prototype属性),函数所特有的
	Person.prototype.getAge = function () {
		console.log(this.age);
	}
	person1.getAge();


	//  6、原型对象的作用,用原型来扩展对象,方便继承使用原型的属性和方法
	let date = new Date();
	Date.prototype.formate = function () {
		let year = this.getFullYear();
		let month = this.getMonth() + 1;
		let date = this.getDate();
		return `${year}${month}${date}`;
	}
	console.log(date.formate());

	//  7、ES5继承(prototype)
	function User(username, password) {
		this.username = username;
		this.password = password;
		this.login = function () {
			console.log('用户登陆')
		}
	}

	function Admin() {
		this.selectUser = function () {
			console.log('查询用户信息');
		}
	}
	/*  8、原型链:因为原型是一个对象,所以一个对象有原型,而这个原型又可以继承其他对象作为它的原型,
	原型上有原型,原型上还有原型,无限原型,这就叫原型链*/
	Admin.prototype = new User();

	/*  9、调用方法:先在对象上找方法,找不到就往原型上找,再找不到就再往上个原型上找,
	一直住上找,直到找到最上边的(Object)原型为null为止,都找不到就报错。*/
	Object.prototype.name = 'Object';
	Object.prototype.login = function () {
		console.log('Object原型上的登陆方法');
	}

	let admin = new Admin();
	admin.login();
	//  10、所有对象的最上边的原型就是(Object)的原型,都可以调用其属性和方法
	let text = {};
	text.login();
	console.log(text.name);
</script>

</html>

7、学习视频来源:

【前端面试题:原型对象(三)原型继承与原型链-哔哩哔哩】

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

jasmine_qiqi

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值