原型和原型链 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 相关文章推荐
从sohu弄下来的flash中展示图片的代码
Apr 27 Javascript
用JQuery在网页中实现分隔条功能的代码
Aug 09 Javascript
基于jquery实现的可编辑下拉框实现代码
Aug 02 Javascript
javascript日期验证之输入日期大于等于当前日期
Dec 13 Javascript
基于jQuery实现文本框只能输入数字(小数、整数)
Jan 14 Javascript
JS中正则表达式只有3种匹配模式(没有单行模式)详解
Jul 28 Javascript
JS仿hao123导航页面图片轮播效果
Sep 01 Javascript
浅谈bootstrap使用中的一些问题以及解决过程
Oct 18 Javascript
JavaScript如何实现图片懒加载(lazyload) 提高用户体验(增强版)
Nov 30 Javascript
BootStrap Validator 根据条件在JS中添加或移除校验操作
Oct 12 Javascript
Electron-vue脚手架改造vue项目的方法
Oct 22 Javascript
js删除指定位置超链接中含有百度与360的标题
Jan 06 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
php中异常处理方法小结
2015/01/09 PHP
实例解析php的数据类型
2018/10/24 PHP
学习YUI.Ext 第三天
2007/03/10 Javascript
event.keyCode键码值表 附只能输入特定的字符串代码
2009/05/15 Javascript
JavaScript 动态创建VML的方法
2009/10/14 Javascript
什么是Node.js?Node.js详细介绍
2014/06/01 Javascript
JavaScript中document.forms[0]与getElementByName区别
2015/01/21 Javascript
JQuery给select添加/删除节点的实现代码
2016/04/26 Javascript
微信小程序 PHP后端form表单提交实例详解
2017/01/12 Javascript
vue.js中created方法作用
2018/03/30 Javascript
JavaScript变量声明var,let.const及区别浅析
2018/04/23 Javascript
AngularJS 监听变量变化的实现方法
2018/10/09 Javascript
用Object.prototype.toString.call(obj)检测对象类型原因分析
2018/10/11 Javascript
vue router动态路由设置参数可选问题
2019/08/21 Javascript
详解vue高级特性
2020/06/09 Javascript
vue 动态添加class,三个以上的条件做判断方式
2020/11/02 Javascript
[08:02]DOTA2牵红线 zhou神抱得美人归
2014/03/22 DOTA
[01:07:22]2014 DOTA2华西杯精英邀请赛 5 24 DK VS VG加赛
2014/05/26 DOTA
Python单元测试框架unittest简明使用实例
2015/04/13 Python
python使用socket向客户端发送数据的方法
2015/04/29 Python
Python操作使用MySQL数据库的实例代码
2017/05/25 Python
python获取当前目录路径和上级路径的实例
2018/04/26 Python
Python搭建Spark分布式集群环境
2019/07/05 Python
Python判断三段线能否构成三角形的代码
2020/04/12 Python
解决python Jupyter不能导入外部包问题
2020/04/15 Python
详解HTML5 data-* 自定义属性
2018/01/24 HTML / CSS
美国LOGO设计公司:The Logo Company
2018/07/16 全球购物
广告学专业毕业生自荐信
2013/09/24 职场文书
我的大学生活职业生涯规划
2014/01/02 职场文书
优秀三好学生事迹材料
2014/08/31 职场文书
五一劳动节演讲稿
2014/09/12 职场文书
个人四风问题对照检查材料
2014/09/26 职场文书
2014年护士长工作总结
2014/11/11 职场文书
人才市场接收函
2015/01/30 职场文书
电影雨中的树观后感
2015/06/15 职场文书
公司欠款证明
2015/06/24 职场文书