前言

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

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. 关于IDEA中添加静态资源(html,jpg等)后找不到资源(404 not found),以及WEB-INF目录介绍

    关于静态资源的加载 在IDEA中的java web application(或者maven项目)添加新的静态资源时(如html,jpg,gif等),常常会遇到静态资源无法加载的情况.这样的情况我们一般 ...

  2. 比 Navicat 还要好用、功能更强大的工具!

    DBeaver 是一个基于 Java 开发,免费开源的通用数据库管理和开发工具,使用非常友好的 ASL 协议.可以通过官方网站或者 Github 进行下载. 由于 DBeaver 基于 Java 开发 ...

  3. 1.1 Qt Creater使用Python开发桌面软件的操作流程

    Qt Creater及Python的下载与安装过程不再赘述,读者可自行在网上搜索相应的下载与安装方法. 首先我们打开Qt Creater,单击"Create Project"按钮或 ...

  4. Spring从入门到源码(一)

    Spring 1.什么是框架? 人话就是:方便干活,架子有了,直接拿来用就完事了. spring,springmvc,mybatis三大开框架 2.架构的演变过程 单一应用架构 垂直应用架构 分布式服 ...

  5. XCTF练习题---MISC---Hear-with-your-Eyes

    XCTF练习题---MISC---Hear-with-your-Eyes flag:e5353bb7b57578bd4da1c898a8e2d767 解题步骤: 1.观察题目,下载附件 2.打开附件, ...

  6. ucore lab1 操作系统启动过程 学习笔记

    开头赞美THU给我们提供了这么棒的资源.难是真的难,好也是真的好.这种广查资料,反复推敲,反复思考从通电后第一条代码搞起来理顺一个操作系统源码的感觉是真的爽. 1. 操作系统镜像文件ucore.img ...

  7. vue 代码调试神器

    一.序 工欲善其事,必先利其器.作为一名资深程序员,相信必有一款调试神器相伴左右,帮助你快速发现问题,解决问题.作为前端开发,我还很年轻,也喜欢去捣鼓一些东西,借着文章的标题,先提一个问题:大家目前是 ...

  8. Linux-3作业练习

    1.自建yum仓库,分别为网络源和本地源 请移步: yum源配置 2.编译安装http2.4,实现可以正常访问,并将编译步骤和结果提交. 请移步:http2.4编译安装       总结参照https ...

  9. 神器 Nginx 的学习手册 ( 建议收藏 )

    关注「开源Linux」,选择"设为星标" 回复「学习」,有我为您特别筛选的学习资料~ Nginx 是一个高性能的 HTTP 和反向代理服务器,特点是占用内存少,并发能力强,事实上 ...

  10. Spring 源码(8)Spring BeanPostProcessor的注册、国际化及事件发布机制

    上一篇文章https://www.cnblogs.com/redwinter/p/16198942.html介绍了Spring的注解的解析过程以及Spring Boot自动装配的原理,大概回顾下:Sp ...