当前位置:网站首页>原型和原型链
原型和原型链
2022-08-10 03:29:00 【Kⅈꫛᧁ269】
原型和原型链(创建对象的方法以及继承)
一、创建对象
1、通过构造函数 Object 创建对象
let obj = new Object();
obj.uname = "qweq";
obj.age = "3";
obj.sex = "男";
obj.phone = "1825555555";
2、字面量创建对象
let obj={
uname : "qweq",
age : "3",
sex : "男",
phone : "1825555555"
}
3、通过工厂函数创建对象【菩提函数,构造函数,工厂函数】
function creatPerson() {
let obj = new Object();
obj.uname = "uname";
obj.age = "age";
obj.sex = "sex";
obj.phone = "phone";
return obj;
}
let student0=creatPerso("aaaaa",20,"12132312");
let student1=creatPerso("cccc",20,"12132312");
let student2=creatPerso("ssss",20,"12132312");
let student3=creatPerso("sssaa",20,"12132312");
let student4=creatPerso("wwww",20,"12132312");
4、通过构造函数实例化对象
构造函数函数名首字母必须大写
function Person(uname, age, sex) {
this.uname = uname;
this.age = age;
this.sex = sex;
}
let p = new Person("猿究院", 18, "男"); //实例化对象
let p1 = new Person("212", 18, "男");
console.log(p, p1);
二、原型
1、概念
- 所有引用类型都有一个__proto__(隐式原型)属性,属性值是一个普通的对象
- 所有函数都有一个prototype(原型)属性,属性值是一个普通的对象
- 所有引用类型的__ proto __(隐式原型)属性指向它的构造函数的prototype
let a = [1,2,3];
a.__proto__ === Array.prototype; // true
2、prototype与__ proto __
(1)概念
任何一个函数里面都有一个原型对象,所有函数都有原型对象
(2)用途及其用法
1、构造函数(Person)通过prototype访问原型对象 存放公共方法
Person.prototype
2、实例对象p访问原型对象 __ proto __ 存放公共方法
p.__proto__
3、constructor 构造方法(原型对象创建的构造函数)
原型对象.constructor //原型对象通过constructor 方法访问其构造函数
(3)整体代码展示
<!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>Document</title>
</head>
<body>
</body>
<script> // 所有函数都有原型对象 // 构造函数访问原型对象 prototype --- 存放公共方法 // 实例对象访问原型对象 __proto__ --- 存放公共方法 // constructor 构造方法(原型对象创建的构造函数) // 构造函数 function Person(name,age,sex){
this.name = name; this.age = age; this.sex = sex; } //在构造函数的原型上添加公共方法 Person.prototype.money = function(){
// 原型对象中的 this 指向 调用他的实例对象 console.log(this.name+"---这是原型对象上的挣钱方法"+this.age); } let p = new Person("猿究院",18,"男"); //实例对象 let p1 = new Person("html",20,"nv"); //实例对象 console.log(p,p1); p.money(); p1.money(); Object.prototype.phone = "222222222222"; Person.prototype.phone = "1111111111"; p.phone = "333333333"; console.log(p.phone); </script>
</html>
三、原型链
当访问一个对象的某个属性时,会先在这个对象本身属性上查找,如果没有找到,则会去它的__ proto __隐式原型上查找,即它的构造函数的prototype,如果还没有找到就会再在构造函数的prototype的 __ proto __中查找,这样一层一层向上查找就会形成一个链式结构,我们称为原型链。

①一层一层往上找,若直到找到null还没有找到,则返回undefined
②Object.prototype.__ proto __ === null
③所有从原型或更高级原型中的得到、执行的方法,其中的this在执行时,指向当前这个触发事件执行的对象
四、继承
1、概念
(1)在原有的类的基础上快速增加新的功能
(2)不影响到原来的类,也不改变原来类的代码,方便对于功能的扩展
(3)继承是一种创建新类的方式,新建的类可以继承一个或多个类。
(4)继承描述的是类和类之间的关系
(5)新建的类称为子类,之前存的类称为父类
2、在JS中的用途
利用原型及原型链实现继承【面向对象】
代码展示
<!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>Document</title>
</head>
<body>
</body>
<script> // 利用原型及原型链实现继承【面向对象】 // 父 构造函数 function Father(name, age, sex) {
this.name = name; this.age = age; this.sex = sex; } // Father构造函数的原型对象上的公共方法 Father.prototype.money = function () {
// 原型对象上的 this 指向调用它的 实例对象 console.log(this.name + "……在挣钱"); } // 子 构造函数 function Son(name, age, sex) {
// 指向创建它的实例对象 s // 使用 call() 立即调用父类方法,并传递参数【继承父类属性】 Father.call(this, name, age, sex); // 子类属性 this.email = email; this.name =name; this.age=age; this.sex=sex; } // 直接将父构造函数的原型对象赋值给子构造函数的原型对象 Son.prototype = Father.prototype; // 通过 new 将父类构造函数的 实例对象 赋值 给 son 的原型对象 Son.prototype = new Father(); // 利用 constructor 手动改变Son的原型对象的指向的构造函数 Son.prototype.constructor = Son; // 在Son 的 原型对象上添加 game 方法 Son.prototype.game=function(){
console.log(this.name+"-----在玩游戏"); } let f = new Father("猿究院", 50, "男"); let s = new Son("猿究院", 50, "男"); console.log(f, s); f.money(); s.money(); s.game(); // f.game(); </script>
</html>
边栏推荐
猜你喜欢

Shell 文本三剑客 awk

软件的生命周期(软件工程各阶段的工作)

ES高亮显示语法

Small program subcontracting and subcontracting pre-download

Pytorch中的torch.index_select对应MindSpore哪个方法

数据库学习真难,头大,有偿提问

MySQL数据库初体验

It's almost 35, still "did a little"?What happened to the test workers who had been in the industry for a few years?

MongoDB 常用查询语句

mindspore安装过程中报错cannot find zlib
随机推荐
【网络迁移】Pytorch中的torch.no_grad对应MindSpore哪个方法
10个超赞的C语言开源项目,值得学习
Dijkstra求最短路
常用类以及接口
TCP协议之《TSQ控制》
Embedded Sharing Collection 32
vue项目 npm run build 打包项目防止浏览器缓存
golang go get 时提示 no Go files in xxx
快35了,还在“点点点”?那些入行几年的测试点工后来都怎么样了?
1413.Minimum Value to Get Positive Step by Step Sum
leetcode 27:移除元素
获取属性特性几种方法
The same is a primary test, why does he pay 5,000 yuan more than me?
Neo4J 与 Cypher 查询语言基础
c语言进阶篇:动态内存管理(相关函数、常见错误、笔试题)
mindspore安装过程中报错cannot find zlib
order by注入与limit注入
goland控制台显示重叠问题解决方案
Redis 定长队列的探索和实践
请问mindspore支持l1范数归一化吗