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>