原型和原型链 prototype和proto的区别详情


Posted in Javascript onNovember 02, 2021

1、原型

原型是function对象下的属性,它定义了构造函数的共同祖先,也就是一个父子级的关系,子对象会继承父对象的方法和属性

  • prototype是函数下的属性,对象想要查看原型使用隐式属性__Proto__
  • constructor指向构造函数
  • 自己身上有属性,原型上也有属性,取近的,用自己的

通过给原型添加属性,可以让所有的实例化对象共享属性和方法

Car.prototype = {
 height : 1400,
 lang : 4900,
 carName : 'BMW'
}
function Car() {
}
var car = new Car();

2、原型链

每个实例对象下都有__proto__属性,通过属性__proto__指向构造函数的原型对象,当到达末端时,返回null,这样一层一层向顶端查找,就形成了原型链

prototype是函数特有的, __proto__是对象有的,js中万物皆对象

prototype——proto——区别与作用

  • prototype把共有属性预先定义好,给之后对象使用
  • prototype的存在实现了继承,节省内存空间
  • __proto__是对象的,prototype是函数的,因为函数也是对象,所以函数也有__proto__
  • __proto__的作用是就是当访问一个对象的属性时,如果该对象内部不存在这个属性,那么就会沿着它的**__proto__**属性所指向的那个对象(父对象)里找,也就是原型链
  • prototype的作用是就是让该函数所实例化的对象们都可以找到公用的属性和方法

__proto__对象原型的意义就在于为对象的查找机制提供一个方向,或者说一条路线,但是它是一个非标准属性,因此实际开发中,不可以使用这个属性,它只是内部指向原型对象 prototype

2.1 constructor构造函数

constructor属性存在于__proto__prototype,它指向构造函数本身

一般情况下,对象的方法都在构造函数的原型对象中设置。如果有多个对象的方法,我们可以给原型对象采取对象形式赋值,但是这样就会覆盖构造函数原型对象原来的内容,这样修改后的原型对象 constructor 就不再指向当前构造函数了。此时,我们可以在修改后的原型对象中,添加一个 constructor 指向原来的构造函数。

问题 :修改了函数的原型对象,constructor的指向是谁

function Star(uname, age) {
     this.uname = uname;
     this.age = age;
 }
 // 很多情况下,我们需要手动的利用constructor 这个属性指回 原来的构造函数
 Star.prototype = {
 // 如果我们修改了原来的原型对象,给原型对象赋值的是一个对象,则必须手动的利用constructor指回原来的构造函数
   constructor: Star, // 手动设置指回原来的构造函数
   sing: function() {
     console.log('我会唱歌');
   },
   movie: function() {
     console.log('我会演电影');
   }
}
var zxy = new Star('张学友', 19);
console.log(zxy)

在修改函数原型时,因为Star.prototype就是一个对象,所以constructor指向构造这个对象的原型,也就是object

2.2 call/apply

通过call``apply可以改变this的指向,借用别人的函数完成自己的功能

区别:call传多个参数 apply传一个参数数组

function Person(name,age,sex) {
    this.name = name;
    this.age = age;
    this.sex = sex;
}
function Student(name,age,sex,tel,grade) {
    //var this = {name: "lin", age: "19", sex: "male", tel: 123, grade: 78}
    Person.call(this,name,age,sex);//通过call改变this的指向这个函数
    //Person.apply(this,[name,age,sex])
    this.tel = tel;
    this.grade = grade;
}
var student = new Student('lin','19','male',123,78);

2.3 new()

  • 创建一个空对象
  • 构造函数的this,继承函数原型
  • this指向构造函数的对象实例,执行构造函数内容为新对象添加属性和方法
  • 返回this
var obj = {}//创建空对象
obj.__proto__ = Person.prototype;//继承作用域
Person.call(obj,)//改变this指向
//这三步是隐式的
var person = new Person();//new操作

到此这篇关于原型和原型链 prototype和proto的区别详情的文章就介绍到这了,更多相关原型和原型链 prototype和proto的区别内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Javascript 相关文章推荐
如何在Web页面上直接打开、编辑、创建Office文档
Mar 12 Javascript
javascript Math.random()随机数函数
Nov 04 Javascript
js解析json读取List中的实体对象示例
Mar 11 Javascript
JavaScript 随机验证码的生成实例代码
Sep 22 Javascript
详解JavaScript中this的指向问题
Jan 20 Javascript
基于jstree使用AJAX请求获取数据形成树
Aug 29 Javascript
微信小程序踩坑记录之解决tabBar.list[3].selectedIconPath大小超过40kb
Jul 04 Javascript
Vue多环境代理配置方法思路详解
Jun 21 Javascript
微信小程序通过一个json实现分享朋友圈图片
Sep 03 Javascript
在Layui中操作数据表格,给指定单元格添加事件示例
Oct 26 Javascript
Vue项目结合Vue-layer实现弹框式编辑功能(实例代码)
Mar 11 Javascript
uniapp电商小程序实现订单30分钟倒计时
Nov 01 Javascript
浅谈克隆 JavaScript
Nov 02 #Javascript
WebWorker 封装 JavaScript 沙箱详情
quickjs 封装 JavaScript 沙箱详情
Nov 02 #Javascript
js 数组 fill() 填充方法
浅谈 JavaScript 沙箱Sandbox
详解 TypeScript 枚举类型
Nov 02 #Javascript
前端JavaScript大管家 package.json
You might like
Web程序工作原理详解
2014/12/25 PHP
PHP加密解密函数详解
2015/10/28 PHP
PHP实现的XML操作类【XML Library】
2016/12/29 PHP
Laravel框架集成UEditor编辑器的方法图文与实例详解
2019/04/17 PHP
javascript代码编写需要注意的7个小细节小结
2011/09/21 Javascript
jquery图片放大镜功能的实例代码
2013/03/26 Javascript
javascript的函数作用域
2014/11/12 Javascript
js中使用使用原型(prototype)定义方法的好处详解
2016/07/04 Javascript
jquery获取点击控件的绝对位置简单实例
2016/10/13 Javascript
js实现左右两侧浮动广告
2018/07/09 Javascript
vue-cli的工程模板与构建工具详解
2018/09/27 Javascript
js实现鼠标拖拽缩放div实例代码
2019/03/25 Javascript
Node.js path模块,获取文件后缀名操作
2020/11/07 Javascript
python队列通信:rabbitMQ的使用(实例讲解)
2017/12/22 Python
Python 机器学习库 NumPy入门教程
2018/04/19 Python
Python实现的多项式拟合功能示例【基于matplotlib】
2018/05/15 Python
pthon贪吃蛇游戏详细代码
2019/01/27 Python
python 用for循环实现1~n求和的实例
2019/02/01 Python
使用Python代码实现Linux中的ls遍历目录命令的实例代码
2019/09/07 Python
Windows下实现将Pascal VOC转化为TFRecords
2020/02/17 Python
css3实现信纸/同学录效果的示例代码
2018/12/11 HTML / CSS
AmazeUI在模态框中嵌入表单形成模态输入框
2020/08/20 HTML / CSS
世界上最受欢迎的花店:1-800-Flowers.com
2020/06/01 全球购物
如何在Shell脚本中使用函数
2015/09/06 面试题
关于廉洁的广播稿
2014/01/30 职场文书
万年牢教学反思
2014/02/15 职场文书
骨干教师培训方案
2014/05/06 职场文书
幼儿园区域活动总结
2014/05/08 职场文书
招标承诺书
2014/08/30 职场文书
2016春季运动会通讯稿
2015/07/18 职场文书
《乘法分配律》教学反思
2016/02/24 职场文书
2019让人心动的商业计划书
2019/06/27 职场文书
长辈生日祝福语大全(72句)
2019/08/09 职场文书
导游词之上海东方明珠塔
2019/09/25 职场文书
Mysql存储过程、触发器、事件调度器使用入门指南
2022/01/22 MySQL
MySQL去除密码登录告警的方法
2022/04/20 MySQL