TypeScript与Date类型

2023-10-30

js的继承方式 

/**
 * 经典的js寄生组合式继承
 */
function MyDate() {
    Date.apply(this, arguments);
    this.abc = 1;
}

function inherits(subClass, superClass) {
    function Inner() {}
    
    Inner.prototype = superClass.prototype;
    subClass.prototype = new Inner();
    subClass.prototype.constructor = subClass;
}

inherits(MyDate, Date);

MyDate.prototype.getTest = function() {
    return this.getTime();
};

let date = new MyDate();

console.log(date.getTest());

Date作为构造函数来实例化

new Date();

new Date(value);

new Date(dateString);

new Date(year,month,day,hours,minutes,seconds,milliseconds);

ES5黑魔法

// 需要考虑polyfill情况
Object.setPrototypeOf = Object.setPrototypeOf ||
function(obj, proto) {
    obj.__proto__ = proto;

    return obj;
};

/**
 * 实际上返回的是Date对象
 */
function MyDate() {
    // bind属于Function.prototype,接收的参数是:object, param1, params2...
    var dateInst = new(Function.prototype.bind.apply(Date, [Date].concat(Array.prototype.slice.call(arguments))))();

    // 更改原型指向,否则无法调用MyDate原型上的方法
    // ES6方案中,这里就是[[prototype]]这个隐式原型对象,在没有标准以前就是__proto__
    Object.setPrototypeOf(dateInst, MyDate.prototype);

    dateInst.abc = 1;

    return dateInst;
}

// 原型重新指回Date,否则根本无法算是继承
Object.setPrototypeOf(MyDate.prototype, Date.prototype);

MyDate.prototype.getTest = function getTest() {
    return this.getTime();
};

let date = new MyDate();

// 正常输出,譬如1515638988725
console.log(date.getTest());

shim:是一个库,它将一个新的API引入到一个旧的环境中,而且仅靠旧环境中已有的手段实现

polyfill:就是一个用在浏览器API上的shim,主要抚平不同浏览器之间对js实现的差异

先检查当前浏览器是否支持某个API,如果不支持的话就加载对应的polyfill.然后新旧浏览器就都可以使用这个API了

 prototype 属性:向对象添加属性

ES6大法

class MyDate extends Date {
    constructor() {
        super();
        this.abc = 1;
    }
    getTest() {
        return this.getTime();
    }
}
let date = new MyDate();

// 正常输出,譬如1515638988725
console.log(date.getTest());

ES6写法,然后Babel打包(无法正常调用的)

因为转译后的ES5源码中,仍然是通过MyDate来构造
MyDate的构造中又无法修改属于Date内部的[[Class]]之类的私有标志,
因此构造出的对象仍然不允许调用Date方法(调用时,被引擎底层代码识别为[[Class]]标志不符合,不允许调用,抛出错误)

以上的方法的差别:

 

  1. MyDate们的__proto__指向不一样
  2. Object.prototype.toString.call的输出不一样
  3. 对象本质不一样,可以正常调用的1, 3都是Date构造出的,而其它的则是MyDate构造出的

普通对象是没有prototype属性的,只有隐藏属性__proto__,函数对象则两者兼有

所有函数对象的原型对象都继承自原始对象,即fn.prototype.__proto__为原始对象,Object函数,他的原型对象就是原始对象,即Object.prototype。

什么是原型链回溯?

用 new方法初始化函数得到新对象的__proto__属性指向原型对象

function f(){};
var a = new f();

a.__proto__=>f.prototype.__proto__=>Object.prototype=>null

把有__proto__串起来的直到Object.prototype.__proto__为null的链叫做原型链。原型链实际上就是js中数据继承的继承链。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

TypeScript与Date类型 的相关文章

随机推荐

  • 恒林家居引入纷享销客CRM系统,领跑家居行业营销数字化进程

    近日 恒林家居股份有限公司 股票代码 603661以下简称为 恒林家居 携手纷享销客在湖州召开了CRM项目启动会 双方领导及核心项目人员齐聚一堂 展开了深度交流并达成了重要共识 作为家居行业的领军企业 恒林家居自22年扩容 大家居 战略赛道
  • apache2.4配置服务器,文件都是从配好的服务器上直接拿下来的,极具参考性

    hello 大家好 我是咖啡汪 今天刚好给服务器配置了 SSL 证书 所以写这篇文章来分享下心得 以下文件包括了80 端口监听代理映射 和 443 端口监听代理映射 1 下载下来的ssl 证书截图如下 2 修改 httpd conf 内容如
  • java入门一:java语法基础

    1 注释 标识符 单行注释 多行注释 文字 文档注释 文字 注释不会被编译 写给程序员看 平时写代码一定写注释 方便别人看的懂你的代码 或者写久了自己忘了干嘛的 关键字 abstract assert boolean int class 不
  • 毕业差不多一年,跳槽华为od岗,已入职

    先说一下2022年上半年od岗的面试流程 简历筛选 全日制本科以上 机试 性格面试 技术一面 技术二面 hr面 主管面 博主当时面试到入职用了两个多月 都是线上面试 可以约晚上或者周末 机试 三道算法题 大概就是力扣简单 中等 困难的三种类
  • python中while循环打印99乘法表

    花式打印9 9乘法表 第一个计数器 i 1 while i lt 10 第二个计数器 j 1 while j lt i print d d d t j i i j end j 1 换行 print i 1 输出换行 print i 1 wh
  • 行业代码小程序开发制作方案

    随着移动互联网的快速发展 小程序成为用户获取服务的新途径 尤其在行业领域 如餐饮 零售 教育等 小程序的应用越来越广泛 方案旨在开发一款行业代码小程序 为行业用户提供便捷 高效的服务体验 一 产品定位 产品定位为行业代码小程序 旨在为行业用
  • 数据库基本概念review

    1 基本概念 1 1 数据库阶段 人工管理阶段 文件系统阶段 使用文件系统来进行管理 缺陷 数据荣誉 数据不一致 数据库阶段 三大事件 层次模型的出现 网状模型的出现 关系模型的出现 Codd 1 2 DB DBMS DBS定义 数据库 D
  • Zip压缩解压缩之C++实现。

    压缩 可压缩单一文件 也可压缩文件夹里的多个文件 包括文件夹里面的子文件夹 压缩的目标文件格式无限制 demo文件使用的是 text h cpp png bmp wav mp4等 解压缩 非覆盖解压缩 1 codeproject下载地址 h
  • openssl rand 密码字符长度 -base64

    openssl rand 6 base64 MuCB2GeN openssl rand 14 base64 xIHqPvf9PCkRr355gyg OpenSSL简介 在所有的类 Unix 发行版 Solaris Mac OS X 和 Wi
  • qt之QSqlQuery类执行SQL语句

    转载自 https wizardforcel gitbooks io qt beginning content 28 html 导语 SQL即结构化查询语言 是关系数据库的标准语言 前面两节中已经在Qt里利用QSqlQuery类执行了SQL
  • AngularJS 发送POST请求到后台

    这两个周公司要换前端框架 采用Ionic AngularJS来展示App 原来的App采用的是H5做的 说是H5用户体验不怎么好 所以叫我调研下 说真的 刚开始真的是一脸懵逼 找各种资料 论坛 视频 看了很多博客 很多大牛都说学习Ionic
  • 决策树算法的核心思想

    本文来自 公众号 自然语言处理与机器学习 作者 忆臻 一 算法思想 决策树 decision tree 是一个树结构 可以是二叉树或非二叉树 其每个非叶节点表示一个特征属性上的测试 每个分支代表这个特征属性在某个值域上的输出 而每个叶节点存
  • Prompt工程师指南[应用篇]:Prompt应用、ChatGPT

    1 ChatGPT Prompt Engineering 主题 与 ChatGPT 对话 Python 笔记本 ChatGPT介绍 ChatGPT是OpenAI训练的一种新型模型 可以进行对话交互 该模型经过训练 可以按照提示中的指令 在对
  • 获取顺序栈的栈顶元素

    转至 http www nowamagic net librarys veda detail 2276 获取顺序栈的栈顶元素 GetTop S e 若栈存在且非空 用e返回S的栈顶元素 参考之前线性表的话 就是设一个存储栈顶的变量 e 然后
  • 18、INSERT:插入数据(添加数据)

    数据库与表创建成功以后 需要向数据库的表中插入数据 在 MySQL 中可以使用 INSERT 语句向数据库已有的表中插入一行或者多行元组数据 基本语法 INSERT 语句有两种语法形式 分别是 INSERT VALUES 语句和 INSER
  • 实现打怪得分效果。(Unity)

    首先创建一个Text文本UI组件 并且通过锚点进行文本位置的摆放 并通过修改下面箭头处的值调整Text文本的大小和颜色 如果有字体也可以修改字体样式 也可以在添加组件处添加一个shadow组件修改x和y的值 使文本具有立体和阴影感看起来更有
  • STM32——蓝牙模块HC06

    STM32 蓝牙模块HC06 选用的芯片是STM32F407的芯片 一个HC06的蓝牙模块 我们采用串口连接 所以我们在芯片原理图找出串口模块 参数 STM32串口异步通信定义的参数传送格式 起始位 数据位 8位或者9位 奇偶校验位 第9位
  • 第二章 计算机发展与应用

    计算机从诞生至今已经经历了多个阶段的发展 包括 1 电子管时代 1940年代 1950年代 计算机使用电子管作为主要的电子元件 这些计算机体积庞大 功耗大 但是它们标志着计算机的诞生 并且在二战期间被广泛应用于军事领域 2 晶体管时代 19
  • 6.2、客户/服务器方式(C/S)&对等方式(P2P方式)

    网络应用程序运行在处于网络边缘的不同的端系统上 通过彼此间的通信来共同完成某项任务 开发一种新的网络应用首先要考虑的问题就是 网络应用程序在各种端系统上的组织方式和它们之间的关系 color red 网络应用程序在各种端系统上的组织方式和它
  • TypeScript与Date类型

    js的继承方式 经典的js寄生组合式继承 function MyDate Date apply this arguments this abc 1 function inherits subClass superClass function