从Typescript看原型链
话不多说先来段代码
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看原型链的更多相关文章
- 简单粗暴地理解js原型链--js面向对象编程
原型链理解起来有点绕了,网上资料也是很多,每次晚上睡不着的时候总喜欢在网上找点原型链和闭包的文章看,效果极好. 不要纠结于那一堆术语了,那除了让你脑筋拧成麻花,真的不能帮你什么.简单粗暴点看原型链吧, ...
- 简单粗暴地理解 JavaScript 原型链 (一个充满歪门邪理的理解方法,有助于新手哦!)
原型链理解起来有点绕了,网上资料也是很多,每次晚上睡不着的时候总喜欢在网上找点原型链和闭包的文章看,效果极好. 不要纠结于那一堆术语了,那除了让你脑筋拧成麻花,真的不能帮你什么.简单粗暴点看原型链吧, ...
- 好文要顶之 --- 简单粗暴地理解 JavaScript 原型链
原型链理解起来有点绕了,网上资料也是很多,每次晚上睡不着的时候总喜欢在网上找点原型链和闭包的文章看,效果极好. 不要纠结于那一堆术语了,那除了让你脑筋拧成麻花,真的不能帮你什么.简单粗暴点看原型链吧, ...
- JS 原型链学习总结
废话篇: 在js的学习过程中有一大难点就是原型链.学习的时候一直对这一内容不是十分的明白.纠结的我简直难受.,幸好总算给他弄通了,哇咔咔,总算可以不用在睡梦中还想着他了. 正文篇: 要了解原型链我们首 ...
- 谈谈我对 js原型链的理解
想要学习 “原型链” 必须要认识什么是 “原型” 和 “原型链” 先理解一下普通的继承和原型的区别,下面写一段js代码来帮助理解: var Animal = function(){ // 动物抽象类 ...
- js 原型链和继承(转)
在理解继承之前,需要知道 js 的三个东西: 什么是 JS 原型链 this 的值到底是什么 JS 的 new 到底是干什么的 1. 什么是 JS 原型链? 我们知道 JS 有对象,比如 var ob ...
- 转自知乎大神---什么是 JS 原型链?
我们知道 JS 有对象,比如 var obj = { name: 'obj' } 我们可以对 obj 进行一些操作,包括 「读」属性 「新增」属性 「更新」属性 「删除」属性 下面我们主要来看一下「读 ...
- 简单粗暴地理解js原型链–js面向对象编程
简单粗暴地理解js原型链–js面向对象编程 作者:茄果 链接:http://www.cnblogs.com/qieguo/archive/2016/05/03/5451626.html 原型链理解起来 ...
- 【nodejs原理&源码赏析(3)】欣赏手术级的原型链加工艺术
目录 一. 概述 二. 原型链基础知识 三. Worker类的原型链加工 四. 实例的生成 五. 最后一个问题 六. 一些心得 示例代码托管在:http://www.github.com/dashno ...
随机推荐
- vs中添加库文件WinMM.Lib
C:\Program Files (x86)\Microsoft SDKs\Windows\v7.1A\Lib\WinMM.Lib;
- WPF网格绑定控件并控制控件是否可读
<DataGridTemplateColumn Width="100" Header="实测值"> <DataGridTemplateColu ...
- 深入Dockerfile(一): 语法指南(转)
最近在学习K8S,发现这两篇文章还不错,转了过来 docker官方文档Dockerfile reference的笔记. 一.机制 1.1 构建 docker构建一个镜像,需要: Dockerfile文 ...
- python的bit_length方法
bit_length方法作用是得到指定数值的二进制的长度数.宽度数 举例: age=1 v=age.bit_length() print(v) 返回结果: 1 #数值1对应的二进制是1,长度1位 ...
- python基础之socket编程
一 客户端/服务器架构 二 osi七层 三 socket层 四 socket是什么 五 套接字发展史及分类 六 套接字工作流程 七 基于TCP的套接字 八 基于UDP的套接字 九 粘包现象 十 什么是 ...
- Python CGI编程
CGI(Common Gateway Interface)通用网关接口,它是一段程序,运行在服务器上.如:HTTP服务器,提供同客户端HTML页面的接口. CGI程序可以是python脚本,PERL脚 ...
- js 中格式化显示时间
function getMyDateTime(str){ var oDate = new Date(str), oYear = oDate.getFullYear(), oMonth = oDate. ...
- EasyUI的datagrid加载数据去掉遮罩
转自:https://blog.csdn.net/why15732625998/article/details/77977570 代码: $(".datagrid-mask").r ...
- CMD运行JAVA出现编码GBK的不可映射字符处理方法?
方法一: (将notepad编辑器的编码方式改为ANSI后再进行程序代码的编译,将之前乱码的汉字删除重新输入正常的汉字) 1.notepad编辑器默认编码方式为UTF-8时,CMD里面执行javac ...
- 第二阶段第三次spring会议
昨天我对便签加上了清空回收站功能 private void 清空回收站ToolStripMenuItem_Click(object sender, EventArgs e) { DelectText( ...