话不多说先来段代码

class Parent {
private name:string;
constructor(name) {
this.name = name;
} public getName():string {
return this.name;
} public setName(name:string):void {
this.name = name;
} sayHi() {
return `Parent name is ${this.name}`;
}
} class Child extends Parent {
constructor(name) {
super(name);
} sayHi() {
return `Child call Parent' sayHi() to show parent name is ${super.getName()}`;
}
} const xiaoxu = new Child('xiaoxu');
console.log(xiaoxu.sayHi());
var __extends = (this && this.__extends) || (function() {
var extendStatics = Object.setPrototypeOf || ({
__proto__: []
} instanceof Array && function(d, b) {
d.__proto__ = b;
}
) || function(d, b) {
for (var p in b)
if (b.hasOwnProperty(p))
d[p] = b[p];
}
;
return function(d, b) {
extendStatics(d, b);
function __() {
this.constructor = d;
}
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype,
new __());
}
;
}
)();
var Parent = /** @class */
(function() {
function Parent(name) {
this.name = name;
}
Parent.prototype.getName = function() {
return this.name;
}
;
Parent.prototype.setName = function(name) {
this.name = name;
}
;
Parent.prototype.sayHi = function() {
return "Parent name is " + this.name;
}
;
return Parent;
}());
var Child = /** @class */
(function(_super) {
__extends(Child, _super);
function Child(name) {
return _super.call(this, name) || this;
}
Child.prototype.sayHi = function() {
return "Child call Parent' sayHi() to show parent name is " + _super.prototype.getName.call(this);
}
;
return Child;
}(Parent));
var xiaoxu = new Child('xiaoxu');
console.log(xiaoxu.sayHi());
var __extends = this && this.__extends;
var extendsFn = function() {
var extenStatics = Object.setPrototypeOf; }
__extends = __extends || // 这句其实比较有意思
{__proto__: []} instanceof Array && function ss(){} // 首先我们知道如果var a = new A(), 那么a.__proto__ = A.prototype 而A.prototype.__proto__ = Object.prototype
//所以假设var a = {__proto__: []},那么也就意味着a.__proto__ = []
// 再说下instanceof,我们先写一个伪instanceof
// 所以[].__proto__ = Array.prototype 当然所以可以理解为a是[]的子类,是Array的子子类。
// 其实这段话的意思就是来判断当前环境是否支持__proto__作为隐式链接来进行原型链查找,其实是一种环境检测的方法,非常赞。 // 这样d.__proto = b,使得d可以引用b上的属性,即静态变量 // A instanceof B === fakeInstanceof(A, B)
function fakseInstanceof(a, b) {
var L = a.__proto__
var M = b.prototype
if(L === M) {
return true;
} else {
return false;
}
} // 更帅的一段来了
function __() {
this.constructor = d;
} d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, d = new __()) // 傻眼了吧,这里__就是一个桥梁,因为d = new __()所以d.__proto__ = __.prototype, 又因为__.prototype = b.prototype,
// 这样我们就可以在d和b之间形成原型链,且将隔离性做到很好
// 别忘记d = new __()会改变constructor,这里我们用this.constructor很好的结局了。
// ??这里是否有效率提升,参考anujs的解释。

从Typescript看原型链的更多相关文章

  1. 简单粗暴地理解js原型链--js面向对象编程

    原型链理解起来有点绕了,网上资料也是很多,每次晚上睡不着的时候总喜欢在网上找点原型链和闭包的文章看,效果极好. 不要纠结于那一堆术语了,那除了让你脑筋拧成麻花,真的不能帮你什么.简单粗暴点看原型链吧, ...

  2. 简单粗暴地理解 JavaScript 原型链 (一个充满歪门邪理的理解方法,有助于新手哦!)

    原型链理解起来有点绕了,网上资料也是很多,每次晚上睡不着的时候总喜欢在网上找点原型链和闭包的文章看,效果极好. 不要纠结于那一堆术语了,那除了让你脑筋拧成麻花,真的不能帮你什么.简单粗暴点看原型链吧, ...

  3. 好文要顶之 --- 简单粗暴地理解 JavaScript 原型链

    原型链理解起来有点绕了,网上资料也是很多,每次晚上睡不着的时候总喜欢在网上找点原型链和闭包的文章看,效果极好. 不要纠结于那一堆术语了,那除了让你脑筋拧成麻花,真的不能帮你什么.简单粗暴点看原型链吧, ...

  4. JS 原型链学习总结

    废话篇: 在js的学习过程中有一大难点就是原型链.学习的时候一直对这一内容不是十分的明白.纠结的我简直难受.,幸好总算给他弄通了,哇咔咔,总算可以不用在睡梦中还想着他了. 正文篇: 要了解原型链我们首 ...

  5. 谈谈我对 js原型链的理解

    想要学习 “原型链” 必须要认识什么是 “原型” 和 “原型链” 先理解一下普通的继承和原型的区别,下面写一段js代码来帮助理解: var Animal = function(){ // 动物抽象类 ...

  6. js 原型链和继承(转)

    在理解继承之前,需要知道 js 的三个东西: 什么是 JS 原型链 this 的值到底是什么 JS 的 new 到底是干什么的 1. 什么是 JS 原型链? 我们知道 JS 有对象,比如 var ob ...

  7. 转自知乎大神---什么是 JS 原型链?

    我们知道 JS 有对象,比如 var obj = { name: 'obj' } 我们可以对 obj 进行一些操作,包括 「读」属性 「新增」属性 「更新」属性 「删除」属性 下面我们主要来看一下「读 ...

  8. 简单粗暴地理解js原型链–js面向对象编程

    简单粗暴地理解js原型链–js面向对象编程 作者:茄果 链接:http://www.cnblogs.com/qieguo/archive/2016/05/03/5451626.html 原型链理解起来 ...

  9. 【nodejs原理&源码赏析(3)】欣赏手术级的原型链加工艺术

    目录 一. 概述 二. 原型链基础知识 三. Worker类的原型链加工 四. 实例的生成 五. 最后一个问题 六. 一些心得 示例代码托管在:http://www.github.com/dashno ...

随机推荐

  1. RPC web service

    ---------------------------------------------------------------------------------------------------- ...

  2. 项目(十)openvpn架构实施方案(一)跨机房异地灾备

    第一章VPN介绍   1.1 VPN概述 VPN(全称Virtual Private Network)虚拟专用网络,是依靠ISP和其他的NSP,在公共网络中建立专用的数据通信网络的技术,可以为企业之间 ...

  3. 使用pycharm 出现 interpreter field is empty 完美解决方法(转载 记录)

    使用pycharm 出现 interpreter field is empty 主要是因为你的电脑没有正确安装python或者安装python出错,重新下载安装覆盖就行 下载安装包:从Python的官 ...

  4. Java框架spring 学习笔记(十八):事务管理(xml配置文件管理)

    在Java框架spring 学习笔记(十八):事务操作中,有一个问题: package cn.service; import cn.dao.OrderDao; public class OrderSe ...

  5. python note 13 内置函数

    1. lst = ["白蛇传","骷髅叹","庄周闲游"] it = lst.__iter__() print(it.__next__()) ...

  6. 转*SqlSever查询某个表的列名称、说明、备注、注释,类型等

    @原文地址 关键部分如下: ------sqlserver 查询某个表的列名称.说明.备注.类型等 SELECT 表名 then d.name else '' end, 表说明 then isnull ...

  7. The declared package does not match the expected package Java

    今天使用vscode 编写java代码做测试时候,发现这个问题,大概总结一下. 目录结构 bao -> Point.java test.java package bao; public clas ...

  8. oralce 的安装以及plsql的配置的html连接

    https://www.cnblogs.com/xkstudy/p/6400738.html

  9. 跨域的处理方式 JSONP和CORS和反向代理

    什么是跨域? 首先了解同源策略,三个相同,协议,域名端口号相同就是同源,那么三者有任意不同就会造成跨域.跨域不常见,跨域基本上就是访问别人的资源. 如何解决跨域问题? 常见的有三种 一:jsonp处理 ...

  10. centos vi设置tab为4个空格 和括号自动补全

    1.打开vim配置文件 vi /etc/vimrc 2.设置tab为4个空格, 在文件末尾添加以下内容 if has( "autocmd" ) filetype plugin in ...