原型和原型链 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 相关文章推荐
Extjs TriggerField在弹出窗口显示不出问题的解决方法
Jan 08 Javascript
跨浏览器的 mouseenter mouseleave 以及 compareDocumentPosition的使用说明
May 04 Javascript
javascript与CSS复习(三)
Jun 29 Javascript
JavaScript高级程序设计阅读笔记(十六) javascript检测浏览器和操作系统-detect.js
Aug 14 Javascript
javascript将相对路径转绝对路径示例
Mar 14 Javascript
JS实现不使用图片仿Windows右键菜单效果代码
Oct 22 Javascript
Boostrap入门准备之border box
May 09 Javascript
JQuery异步提交表单与文件上传功能示例
Jan 12 Javascript
Vue 实用分页paging实例代码
Apr 12 Javascript
全面介绍vue 全家桶和项目实例
Dec 27 Javascript
AngularJS 将再发布一个重要版本 然后进入长期支持阶段
Jan 31 Javascript
jQuery幻灯片插件owlcarousel参数说明中文文档
Feb 27 jQuery
浅谈克隆 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 CLI实现简单的数据库实时监控调度
2009/07/01 PHP
采用memcache在web集群中实现session的同步会话
2014/07/05 PHP
PHP+Mysql+jQuery中国地图区域数据统计实例讲解
2015/10/10 PHP
PHP操作MySQL中BLOB字段的方法示例【存储文本与图片】
2017/09/15 PHP
jquery maxlength使用说明
2011/09/09 Javascript
js截取字符串的两种方法及区别详解
2013/11/05 Javascript
利用javaScript实现点击输入框弹出窗体选择信息
2013/12/11 Javascript
jQuery CSS()方法改变现有的CSS样式
2014/08/20 Javascript
JS实现文件动态顺序载入的方法
2015/03/07 Javascript
JavaScript将字符串转换为整数的方法
2015/04/14 Javascript
JS使用正则表达式实现关键字替换加粗功能示例
2016/08/03 Javascript
谈谈target=_new和_blank的不同之处
2016/10/25 Javascript
bootstrap3使用bootstrap datetimepicker日期插件
2017/05/24 Javascript
详解express使用vue-router的history踩坑
2019/06/05 Javascript
[05:59]带你看看DPC的台前幕后
2021/03/11 DOTA
Python urllib模块urlopen()与urlretrieve()详解
2013/11/01 Python
Python中使用ConfigParser解析ini配置文件实例
2014/08/30 Python
python编程实现归并排序
2017/04/14 Python
Python 机器学习库 NumPy入门教程
2018/04/19 Python
Python增强赋值和共享引用注意事项小结
2019/05/28 Python
使用Python实现 学生学籍管理系统
2019/11/26 Python
Pytorch mask_select 函数的用法详解
2020/02/18 Python
python语言中有算法吗
2020/06/16 Python
HTML5中外部浏览器唤起微信分享功能的代码
2020/09/15 HTML / CSS
The Body Shop美体小铺西班牙官网:天然化妆品
2019/06/21 全球购物
JYSK加拿大:购买家具、床垫、家居装饰等
2020/02/14 全球购物
全球性的众包图形设计市场:DesignCrowd
2021/02/02 全球购物
一套C#面试题
2013/10/09 面试题
C#中类(class)与结构(struct)的异同
2013/11/03 面试题
优秀毕业生自我鉴定
2014/01/19 职场文书
初中三好学生自我鉴定
2014/04/07 职场文书
学习方法演讲稿
2014/05/10 职场文书
中国文明网向国旗敬礼活动精彩寄语2014
2014/09/27 职场文书
教师群众路线教育实践活动学习笔记
2014/11/05 职场文书
父亲节寄语大全
2015/02/27 职场文书
python基础之函数的定义和调用
2021/10/24 Python