原型和原型链 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 相关文章推荐
使用JavaScript实现Java的List功能(实例讲解)
Nov 07 Javascript
javascript使用shift+click实现选择和反选checkbox的方法
May 04 Javascript
js实现仿京东2级菜单效果(带延时功能)
Aug 27 Javascript
KnockoutJS 3.X API 第四章之数据控制流if绑定和ifnot绑定
Oct 10 Javascript
JS中位置与大小的获取方法
Nov 22 Javascript
解析预加载显示图片艺术
Dec 05 Javascript
Ajax验证用户名或昵称是否已被注册
Apr 05 Javascript
利用jquery去掉时光轴头尾部线条的方法实例
Jun 16 jQuery
AngularJS中filter的使用实例详解
Aug 25 Javascript
微信小程序开发之好友列表字母列表跳转对应位置
Sep 26 Javascript
深入浅析javascript函数中with
Oct 28 Javascript
Vue 解决父组件跳转子路由后当前导航active样式消失问题
Jul 21 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&MYSQL分页原理及实现
2007/01/02 PHP
PHP 常用数组内部函数(Array Functions)介绍
2013/06/05 PHP
php中OR与|| AND与&&的区别总结
2013/10/26 PHP
百度地图API使用方法详解
2015/08/25 PHP
PHP实现文件上传与下载实例与总结
2016/03/13 PHP
如何让DIV可编辑、可拖动示例代码
2013/09/18 Javascript
js阻止浏览器默认行为触发的通用方法(推荐)
2016/05/15 Javascript
基于JS实现无缝滚动思路及代码分享
2016/06/07 Javascript
BOM系列第一篇之定时器setTimeout和setInterval
2016/08/17 Javascript
解析js如何获取css样式
2016/12/11 Javascript
BootStrap Datepicker 插件修改为默认中文的实现方法
2017/02/10 Javascript
深究AngularJS之ui-router详解
2017/06/13 Javascript
Vue 过滤器filters及基本用法
2017/12/26 Javascript
js正则相关知识点专题
2018/05/10 Javascript
Vue2.0中三种常用传值方式(父传子、子传父、非父子组件传值)
2018/08/16 Javascript
JavaScript判断数组类型的方法
2019/10/23 Javascript
[03:07]DOTA2英雄基础教程 冰霜诅咒极寒幽魂
2013/12/06 DOTA
[01:09]2014DOTA2国际邀请赛 TI4西雅图DOTA2 中国美女coser加油助威
2014/07/20 DOTA
[38:21]2018DOTA2亚洲邀请赛3月30日 小组赛A组 LGD VS Newbee
2018/03/31 DOTA
python 正则式 概述及常用字符
2009/05/07 Python
Tensorflow中使用tfrecord方式读取数据的方法
2018/06/19 Python
详解python使用pip安装第三方库(工具包)速度慢、超时、失败的解决方案
2018/12/02 Python
PyCharm安装Markdown插件的两种方法
2019/06/24 Python
关于 Python opencv 使用中的 ValueError: too many values to unpack
2019/06/28 Python
Numpy与Pytorch 矩阵操作方式
2019/12/27 Python
Python利用socket模块开发简单的端口扫描工具的实现
2021/01/27 Python
深入浅析CSS3中的Flex布局整理
2020/04/27 HTML / CSS
HTML5 Canvas draw方法制作动画效果示例
2013/07/11 HTML / CSS
阿玛尼美妆英国官网:Giorgio Armani Beauty英国
2019/03/28 全球购物
通用自荐信范文
2014/03/14 职场文书
学校食堂食品安全责任书
2014/07/28 职场文书
写给老师的保证书
2015/05/09 职场文书
小学生安全保证书
2015/05/09 职场文书
办公室主任岗位竞聘书
2015/09/15 职场文书
Java实现多线程聊天室
2021/06/26 Java/Android
IIS服务器中设置HTTP重定向访问HTTPS
2022/04/29 Servers