JavaScript原型对象与原型链

在JavaScript实际项目中,对象是十分重要的一种类型
无论是作为数据表现的一种形式或配置成工厂模式制造实例等等,这些用途在实际项目开发中都使用得非常广泛
依靠原型对象的特性可以实现一些比较模式化或适配第三方定制化的功能流程

对象

在了解原型与原型链之前我们先了解一下对象的相关知识,了解对象是理解原型链的基础

对象创建

1、字面创建

 const testObj = {key1: 1,key2: 2,key3: 3,objFun:function () {console.log(this.name);}};

2、使用new Object()创建

 const testObj = new Object(); // 创建对象testObj.name = 'test'; // 为对象添加属性

3、构造函数创建

function Car(brand, model, price) {this.brand = brand;this.model = model;this.price = price;this.toBuy = function(){// axios... 请求接口或函数逻辑}
}
const c1 = new Person('梅赛德斯', 'C', 600000);

4、工厂模式化函数创建

function setCar(brand, model, price) {// ......可添加逻辑或参数处理let Car = new Object();Car.brand = brand;Car.model = model;Car.price = price;Car.toBuy = function(){// axios... 请求接口或函数逻辑}return Car;
}
var c1 = setCar('张三', 22, 'actor');

一般偏于模式流程化的对象处理我们会用3或4,1和2一般用于定义处理数据

总结来说3和4可以将配置写入函数中,创造出多个对象
如车为例,可创造出多型号的车的  对象
new Person('梅赛德斯', 'C', 600000)、
new Person('大众', 'B', 90000)
...
对象流程化处理示例
function Car(brand, model, price) {this.brand = brand;this.model = model;this.price = price;this.toBuy = function(){console.log(`you will buy this car  ${this.brand}-${this.model}`)// axios... 请求接口或函数逻辑}
}
const c1 = new Car('梅赛德斯', 'C', 600000);
const c2 = new Car('大众', 'B', 90000);
c1.toBuy()
c2.toBuy()
console.log(c1.toBuy)
console.log(c2.toBuy)


我们可以看到这是根据不同的传入参数,
1、函数创建了不同的对象
2、属性实现了不同的结果

但这种创建模式存在一种性能问题,里面可以公共的函数方法同时也被创建了
等于说一个公用方法进行了多次创建
比如上图中的toBuy函数,虽然函数体一致,但其实指向的是不同的内存地址
此时存在性能浪费

基于以上性能问题,如果还想让该函数绑定在类中我们可以定义静态方法进行管理
我们可以不创建实例的情况下调用该函数,当然使用静态方法还有很多别的用处

function Car(brand, model, price) {this.brand = brand;this.model = model;this.price = price;// this.toBuy = function(){//    console.log(`you will buy this car  ${this.brand}-${this.model}`)//   // axios... 请求接口或函数逻辑// }
}// 静态方法Car.toBuy = function(brand,model){console.log(`you will buy this car  ${brand}-${model}`)// axios... 请求接口或函数逻辑}// 效果与上等同,通过class与static语法糖调用// class Car {// static toBuy(brand,model) {//   return console.log(`you will buy this car  ${brand}-${model}`);//      }//   }// const c1 = new Car('梅赛德斯', 'C', 600000);
// const c2 = new Car('大众', 'B', 90000);Car.toBuy('梅赛德斯', 'C');
Car.toBuy('大众', 'B');// 静态方法无法通过实例调用,只能通过类调用
// c1.toBuy() 报错
// c2.toBuy() 报错

但针对于此是否有更好的方案,下面引出原型对象prototype

prototype

构造函数中有一个prototype属性,prototype指向另一个对象。prototype中定义的方法或属性可共享至构造函数。
我们可以将一些公共的方法定义在prototype上,通过实例调用它
总体意思即为公共函数和方法可以定义在原型对象prototype上

function Car(brand, model, price) {this.brand = brand;this.model = model;this.price = price;// this.toBuy = function(){//    console.log(`you will buy this car  ${this.brand}-${this.model}`)//   // axios... 请求接口或函数逻辑// }
}Car.prototype.toBuy = function(){// this 指向调用该函数的实例console.log(`you will buy this car  ${this.brand}-${this.model}`)// axios... 请求接口或函数逻辑}const c1 = new Car('梅赛德斯', 'C', 600000);const c2 = new Car('大众', 'B', 90000);c1.toBuy()c2.toBuy()

输出结果:

如此以来可以解决性能浪费的问题
但是实例对象为什么可以调用(父类)的prototype方法呢?我们接下来往下看

function Car(brand, model, price) {this.brand = brand;this.model = model;this.price = price;// this.toBuy = function(){//    console.log(`you will buy this car  ${this.brand}-${this.model}`)//   // axios... 请求接口或函数逻辑// }
}Car.prototype.toBuy = function(){console.log(`you will buy this car  ${this.brand}-${this.model}`)// axios... 请求接口或函数逻辑}const c1 = new Car('梅赛德斯', 'C', 600000);const c2 = new Car('大众', 'B', 90000);console.log('c1',c1)console.log('c2',c2)


我们可以看见每个实例中有个属性都指向prototype(这个属性就是__proto__,新版本浏览器已经不支持显示)
我们可以打印一下:

由此我们可以知道每个实例都可以指向原型prototype,在此梳理一下三者关系:

在官方MDN中该属性已被标准除名,所以我们在开发时尽量不要对实例的[Prototype]进行更改,以免影响流程性能
MDN官方说明

根据以上的结论我们总体整理一下原型链的调用方式:
1、主类初始化实例 ① ,实例 ① 调用某个方法
2、实例本身是否继承了该方法 ? 执行该方法 : 根据__proto__指向去原型对象prototype寻找该方法
3、prototype是否存在该方法 ? 执行该方法 : 根据prototype(本身也是个对象)的__proto__指向去更上层的父类寻找该方法(Object)

Object也没有则指向null,最后都没有则会抛出我们最常见的 xxx is undefined 哈哈写到这我笑了
所以对于不确定的数组与对象一定要做数据保护

总结流程图:

JavaScript原型对象与原型链相关推荐

  1. javascript原型对象、原型链、构造函数

    1.原型对象(原型).原型链 先放一张在网上看到的关于原型和原型链的图,非常不错. 如果你能看懂,那就对原型链有了一定了解,如果看不懂,对照下面这几点来看图: js中所有函数都有一个prototype ...

  2. JavaScript 原型对象和原型链

    开篇 之前对js中的原型链和原型对象有所了解,每当别人问我什么是原型链和原型对象时,我总是用很官方(其实自己不懂)的解释去描述.有一句话说的好:如果你不能把一个很复杂的东西用最简单的话语描述出来,那就 ...

  3. JavaScript 原型对象和原型链理解

    一个例子让你彻底明白原型对象和原型链 1. 之前对js中的原型链和原型对象有所了解,每当别人问我什么是原型链和原型对象时,我总是用很官方(其实自己不懂)的解释去描述.有一句话说的好:如果你不能把一个很 ...

  4. 【javascript】对原型对象、原型链的理解

    原型对象,原型链这些知识属于基础类知识.但是平时开发过程中也很少用到. 看网上的意思,原型链用于es5开发场景下的继承.es6有了类语法糖之后,就自带继承了. 通过理解,个人画了一张原型链解构的关系图 ...

  5. java 原型图_一张图搞懂原型、原型对象、原型链

    基本概念 在javascript中,函数可以有属性. 每个函数都有一个特殊的属性叫作原型(prototype) 每个对象拥有一个原型对象 [[Prototype]] / __proto__ / Obj ...

  6. 三张图搞懂JavaScript的原型对象与原型链

    对于新人来说,JavaScript的原型是一个很让人头疼的事情,一来prototype容易与__proto__混淆,二来它们之间的各种指向实在有些复杂,其实市面上已经有非常多的文章在尝试说清楚,有一张 ...

  7. Js 原型对象与原型链(转)

    原文出处 原创作者: abruzzi 原文图文并茂,很好的说明了原型链的原理,在这里感谢原文作者把文章写的那么通俗易懂. 原型对象 每个javascript对象都有一个原型对象,这个对象在不同的解释器 ...

  8. (转)认识原型对象和原型链

    在Javascript中,万物皆对象,但对象也有区别,大致可以分为两类,即:普通对象 Object 和 函数对象 Function. 一般而言,通过 new Function 产生的对象是函数对象,其 ...

  9. 弄懂原型对象和原型链

    这些都是自己在学习的过程中整理出来的笔记,希望能帮到大家.因为自己也是个前端菜鸟,只是最前端有很浓厚的兴趣,想往这个方面发展,如果有整理不对的地方,请大家斧正. 首先我们需要知道原型是什么? Java ...

最新文章

  1. HDU4635(强连通分量+Kosaraju算法)
  2. java用毫秒数做日期计算的一个踩坑记录
  3. atexit注册进程终止处理函数
  4. lisp压盖_华为笔试题--LISP括号匹配 解析及源码实现
  5. 仿苹果手机_安卓变苹果,苹果控制中心也能用上了
  6. 暴力裁员绝症员工,网易刚刚道歉!丁磊沉默,刘强东意外刷屏:说了这句硬气的话……
  7. QQ在线客服聊天功能
  8. 金融衍生品交易系统(场内交易VS.场外交易)的架构特点
  9. opencv3_java 图像的修剪裁剪Trimming Rect
  10. OSChina 周二乱弹 ——女孩在身上纹了个四叶草
  11. 【GlobalMapper精品教程】006:Excel等表格(.xls)或文本(.txt .csv)坐标文件生成矢量点
  12. c语言从键盘输入十个整数,冒泡法从大到小排序
  13. IPHONE黑解教程
  14. 【231】罗技优联接收器配对使用方法
  15. 常见的dataframe选取行列方式
  16. 最完整的SSM框架搭建流程
  17. 解答私信@weixin_63670635 //2021-10-30 C语言 某商场节假日商品打折,优惠政策如下:(1)购买商品价格低于100元的,不享受优惠。。。
  18. C++ - std::shared_ptr::get
  19. mysql字段值是什么_什么是数据库字段值
  20. HTML完成我的校园网页实现 HTML+CSS

热门文章

  1. Unity_AR_Vuforia实现识别图视频播放
  2. 中小型企业网络规划设计方案_案例讲解 | 某企业物流网络规划案例(上)
  3. css 左右布局高度自适应,CSS布局-高度自适应
  4. maya水管转折_maya问题,怎么在曲线出添加管道?
  5. js清空数组的三种方法
  6. mysql 获取字符串前几位或后几位
  7. 计算机PS英语词汇,Photoshop 词汇中英文对照-L
  8. qrcode.js生成二维码,无法识别
  9. 漫画的由来,卡通漫画、暴走漫画、先锋漫画、漫画与前卫艺术之间的边缘艺术形式、实用漫画、讽刺漫画、幽默漫画的定义...
  10. android 图标素材可查找方向