前言

上文对原型和原型链做了一些简单的概念介绍和解析,本文将浅析一些原型链的扩展。

javaScript原型和原型链

http://lewyon.xyz/prototype.html

扩展原型链

使用new操作符

利用原型是对象的特性,实例化对象的时候,继承多个构造函数的属性和方法

兼容性:支持目前以及所有可想象到的浏览器 (IE5.5 都可以使用)

function parent1() {}

parent1.prototype = {
parentName: "parent1",
}; function parent2() {} let child = new parent1(); child.childName = "child"; parent2.prototype = child; let newChild = new parent2(); console.log(newChild.parentName); // parent1 console.log(newChild.childName); // child

使用Object.create

Object.create

Object.create() 方法创建一个新对象,使用现有的对象来提供新创建的对象的 proto

兼容性:支持当前所有非微软版本或者 IE9 以上版本的浏览器

/**
*
* Object.create(proto,[propertiesObject])
*
* @params proto 新创建对象的原型对象。
* 如果proto参数不是 null 或非原始包装对象,则抛出一个 TypeError 异常,可以使用try和catch捕获抛出的异常
*
* @params propertiesObject 可选参数 ,数据类型:对象
*
* */
const parent1 = {
name: "parent1",
do: function () {
console.log(this.name);
},
};
const child = Object.create(parent1);
child.name = "child"; // child添加自身的属性name
child.do(); // child
/**
*
*
*
*---------------------------------------------------------------------------------------
*
*
* */
function parent2() {}
parent2.prototype = {
name: "parent2",
};
function parent3() {}
let child = Object.create(parent2.prototype);
child.childName = "child";
parent3.prototype = child;
let newChild = new parent3();
console.log(newChild.name); // parent2
console.log(newChild.childName); // child

使用setPrototypeOf

兼容性:不支持 IE8 以下的版本。


/**
* Object.setPrototypeOf(obj, prototype)
*
* @params obj 要设置其原型的对象。
*
* @params prototype
*
* 该对象的新原型 (一个对象 或 null)
* 如果要设置原型的对象的 [[Prototype]] 被修改成不可扩展 (通过 Object.isExtensible()查看),就会抛出 TypeError 异常。
* 如果 prototype 参数的数据类型不是 对象或者 null (例如,数字,字符串,boolean,或者 undefined),那么方法就不会执行。
* 否则,该方法将 obj 的 [[Prototype]] 修改为新的值。
*
* Object.setPrototypeOf() 是 ECMAScript 6中新增的方法,相对于操作对象的原型链Object.prototype.__proto__来说,更适合拿来修改对象的原型
*
*
* */ function parent1() {}
parent1.prototype = {
name: "parent1",
};
function parent2() {}
let Obj = {
ObjName: "Obj",
};
Object.setPrototypeOf(Obj, parent1.prototype);
parent2.prototype = Obj;
let newChild = new parent2();
console.log(newChild.name); // parent1
console.log(newChild.ObjName); // Obj

使用__proto__直接在原型链上操作,

使用__proto__操作,如果设置的属性和方法较多,会产生性能问题,因此不太推荐使用__proto__

兼容性:IE10 及以下的浏览器版本。

/**
*
* 直接在原型链上操作,如果设置的属性和方法较多,会产生性能问题
*
* */
var obj = {
__proto__: {
protoName1: "protoName1",
__proto__: {
protoName2: "protoName2",
__proto__: Object.prototype,
},
},
};
console.log(obj.protoName1); // protoName1
console.log(obj.protoName2); // protoName1

小结

  • 在使用原型链编写组件的过程中,我们需要考虑到原型链的性能问题。
  • 实例化对象过程中,会向上查找原型链的方法和属性,在书写的过程中,需要注意构造函数和对象的自带的方法,确认是否会被覆盖和重写。

以上就是js中扩展原型链的简单解析,有任何问题欢迎留言,后续的文章整理然后作为补充。

文章博客地址:JavaScript扩展原型链浅析

源码地址

欢迎关注公众号:程序员布欧,不定期更新一些文章

创作不易,转载请注明出处和作者。

JavaScript扩展原型链浅析的更多相关文章

  1. javascript prototype原型链的原理

    javascript prototype原型链的原理 说到prototype,就不得不先说下new的过程. 我们先看看这样一段代码: <script type="text/javasc ...

  2. Javascript的原型链图

    90%的前端或者js程序员或者老师们对Javascript懂得不比这个多 给手机看的 但是这个图里的所有褐色单向箭头链就是Javascript的原型链(颜色标注对理解js原型链很关键) 这图中的各个_ ...

  3. javaScript系列 [04]-javaScript的原型链

    [04]-javaScript的原型链 本文旨在花很少的篇幅讲清楚JavaScript语言中的原型链结构,很多朋友认为JavaScript中的原型链复杂难懂,其实不然,它们就像树上的一串猴子. 1.1 ...

  4. JavaScript的原型链继承__propt__、prototype、constructor的理解、以及他们之间相互的关系。

    回想自己已经工作了有一段时间了,但是自己对JavaScript的原型链.和继承的理解能力没有到位,最近他们彻底的整理并且复习了一遍. 本案例中部分文案来自网络和书籍,如有侵权请联系我,我只是把我的理解 ...

  5. javaScript(原型链)

    在了解javaScript的原型链之前,我们得先来看一下原型是什么. 在javaScript中,所有的函数都会有着一个特别属性:prototype(显示原型属性):当我们运行如下代码时: functi ...

  6. 理解JavaScript的原型链

    1. 什么是对象 在JavaScript中,对象是属性的无序集合,每个属性存放一个原始值.对象或函数. 1.1 创建对象 在JavaScript中创建对象的两种方法: ① 字面上: var myObj ...

  7. javascript的原型链那些事

    如果你对javascript的原型链还有任何疑问,请看这篇文章 进入主题 前言 原型链的规则不百分百适用于所有情况 显式原型:prototype,是一个对象{} 隐式原型:__proto__,是一个对 ...

  8. javascript 原型与原型链浅析

    原型 和原型链 什么是原型链 简单理解就是原型组成的链,对象的__proto__它的是原型,而原型也是一个对象,也有__proto__属性,原型的__proto__又是原型的原型,就这样可以一直通过_ ...

  9. JavaScript对象原型链的学习

    1.构造函数和原型 1.1对象的三种创建方式 字面量方式 var obj = {}; new关键字 var obj = new Object(); 构造函数方式 function Person(nam ...

随机推荐

  1. [ Perl ] 多线程并发编程

    https://www.cnblogs.com/yeungchie/ 记录一些常用的 模块 / 方法 . 多线程 使用模块 threads use 5.010; use threads; sub fu ...

  2. java中int的最值解析

    java中int的最大值为十进制的2147483647,也就是java能进行操作的最大数值,超出就会显示不正常.针对以下问题进行讨论. 1.最大值为什么是2147483647? java中int类型占 ...

  3. Vue_transition动画

    1 <!DOCTYPE html> 2 <html lang="en" xmlns:v-on="http://www.w3.org/1999/xhtml ...

  4. 异步请求与中断 ( XHR,Axios,Fetch对比 )

    随着AJAX技术的诞生,前端正式进入了局部刷新和前后端分离的新时代,最初的服务请求技术是XHR,随着技术发展和ES6的诞生,jquery ajax,axios,fetch 等技术的产生让前端的异步请求 ...

  5. C# iText 7 切分PDF,处理PDF页面大小

    一.itext 我要使用itext做一个pdf的页面大小一致性处理,然后再根据数据切分出需要的pdf. iText的官网有关于它的介绍,https://itextpdf.com/ 然后在官网可以查找a ...

  6. Ubuntu22.04搭建PWN环境

    前言 最近尝试在Ubuntu最新的版本22.04版本上搭建PWN环境,有了之前在kali上搭建的经验,总的来说问题不大.但搭建的时候还是有不少地方出错了,好在搭建的过程中不断的拍摄快照,所以整个过程还 ...

  7. XCTF练习题---MISC---快乐游戏题

    XCTF练习题---MISC---快乐游戏题 flag:UNCTF{c783910550de39816d1de0f103b0ae32} 解题步骤: 1.观察题目,下载附件 2.还真是一个游戏,赢了就得 ...

  8. 基于DSP_CPLD_aP8942A_LM1791的语音控制

    语音驱动程序  drv_voice.c 语音服务程序  srv_voice.c 1.先运行初始化函数,主要是设置初始音量,并建立一个软件定时器来,以10ms的周期来调用语音播放函数. 1 void s ...

  9. FreeRTOS --(9)任务管理之启动调度器

    转载自 https://blog.csdn.net/zhoutaopower/article/details/107057528 在使用 FreeRTOS 的时候,一般的,先创建若干任务,但此刻任务并 ...

  10. Windows UIA自动化测试框架学习--获取qq好友列表

    前段时间应公司要求开发一款针对现有WPF程序的自动化测试工具,在网上查资料找了一段时间,发现用来做自动化测试的框架还是比较多的,比如python的两个模块pywinauto和uiautomation, ...