ANSYS Icepak电子散热基础教程+ANSYS Icepak进阶应用导航案例,两本pdf,全本无缺。

文件:590m.com/f/25127180-481561494-181d40
(访问密码:551685)

以下内容无关:

-------------------------------------------分割线---------------------------------------------

开篇之前,我想提出3个问题:

新建一个不添加任何属性的对象为何能调用toString方法?
如何让拥有相同构造函数的不同对象都具备相同的行为?
instanceof关键字判断对象类型的依据是什么?
要是这3个问题都能回答上来,那么接下来的内容不看也罢。但若是对这些问题还存在疑虑和不解,相信我,下面的内容将正是你所需要的。

正文
新建一个不添加任何属性的对象为何能调用toString方法?
我在深入了解JavaScript中基于原型(prototype)的继承机制一文中提到过,JavaScript使用的是基于原型的继承机制,它的引用类型与其对应的值将都存在着__proto__[1]属性,指向继承的原型对象[2]。当访问对象属性无果时,便会在其原型对象中继续查找,倘若其原型对象中还是查询无果,那便接着去其原型对象的原型中去查找,直到查找成功或原型为null时[3]才会停止查找。

let obj = {
}
obj.toString();//"[object Object]"
这段代码就是在obj对象中查找toString方法,查询无果,继而在其原型[4]中查找toString方法,正好其原型中含有toString方法,故而得以输出"[object Object]"。

如何让拥有相同构造函数的不同对象都具备相同的行为?
下面是一段实现了发布订阅模式的代码:

let _indexOf = Array.prototype.indexOf;
let _push = Array.prototype.push;
let _slice = Array.prototype.slice;
let _concat = Array.prototype.concat;
let _forEach = Array.prototype.forEach;

function Publish(){
this.subList;

this.indexOf = function(sub){let index = -1;if(typeof this.subList === 'undefined' || this.subList === null){this.subList = [];}if(typeof sub !== 'undefined' && sub !== null){index = _indexOf.call(this.subList,sub);}return index;
}this.addSub = function(sub){let index = this.indexOf(sub);index > -1 ?'' : _push.call(this.subList,sub);
};this.removeSub = function(sub){let index = this.indexOf(sub);index > -1 ?index === 0 ?  this.subList = _slice.call(this.subList,1) :this.subList = _concat.call(_slice.call(this.subList,0,index),_slice.call(this.subList,index + 1)) :  '';
};this.notifySingle = function(sub,msg){let index = this.indexOf(sub);index > -1 ?(typeof sub.onReceive === 'function' ? sub.onReceive(msg) : '') : '';
};this.notifyAll = function(msg){if(typeof this.subList !== 'undefined' && this.subList !== null){_forEach.call(this.subList,(sub)=>{if(typeof sub !== 'undefined' && sub !== null){typeof sub.onReceive === 'function' ? sub.onReceive(msg) : '';}})}
};

}

function Subscription(name){
this.name = name;
this.onReceive = function(msg){
console.log(this.name + ’ 收到消息 : ’ + msg);
};
}

let pub = new Publish();
let sub1 = new Subscription(‘sub1’);
let sub2 = new Subscription(‘sub2’);
let sub3 = new Subscription(‘sub3’);
let sub4 = new Subscription(‘sub4’);

pub.addSub(sub1);
pub.addSub(sub1);
pub.addSub(sub2);
pub.addSub(sub3);
pub.addSub(sub4);

pub.notifyAll(‘这是一条全部推送的消息’);
// sub1 收到消息 : 这是一条全部推送的消息
// sub2 收到消息 : 这是一条全部推送的消息
// sub3 收到消息 : 这是一条全部推送的消息
// sub4 收到消息 : 这是一条全部推送的消息

pub.notifySingle(sub2,“这是一条单独推送的消息”);
// sub2 收到消息 : 这是一条单独推送的消息

pub.removeSub(sub3);

pub.notifyAll(‘这是一条全部推送的消息’);
// sub1 收到消息 : 这是一条全部推送的消息
// sub2 收到消息 : 这是一条全部推送的消息
// sub4 收到消息 : 这是一条全部推送的消息
此代码中拥有同一构造函数的所有对象都含有不同的方法。

sub1.onReceive === sub2.onReceive;//false
sub1.onReceive === sub3.onReceive;//false
sub1.onReceive === sub4.onReceive;//false
sub2.onReceive === sub3.onReceive;//false
sub2.onReceive === sub4.onReceive;//false
sub3.onReceive === sub4.onReceive;//false
这样会导致:
1.浪费内存;
2.不易于对方法进行批量操作。

接下来是改进版本,使用原型达到代码复用的效果:

let _indexOf = Array.prototype.indexOf;
let _push = Array.prototype.push;
let _slice = Array.prototype.slice;
let _concat = Array.prototype.concat;
let _forEach = Array.prototype.forEach;

function Publish(){
this.subList;
}

Publish.prototype.indexOf = function(sub){
let index = -1;
if(typeof this.subList === ‘undefined’ || this.subList === null){
this.subList = [];
}
if(typeof sub !== ‘undefined’ && sub !== null){
index = _indexOf.call(this.subList,sub);
}
return index;
}

Publish.prototype.addSub = function(sub){
let index = this.indexOf(sub);
index > -1 ?
‘’ :
_push.call(this.subList,sub);
};

Publish.prototype.removeSub = function(sub){
let index = this.indexOf(sub);
index > -1 ?
index === 0 ?
this.subList = _slice.call(this.subList,1) :
this.subList = _concat.call(_slice.call(this.subList,0,index),_slice.call(this.subList,index + 1)) :
‘’;
};

Publish.prototype.notifySingle = function(sub,msg){
let index = this.indexOf(sub);
index > -1 ?
(typeof sub.onReceive === ‘function’ ?
sub.onReceive(msg) :
‘’) :
‘’;
};

Publish.prototype.notifyAll = function(msg){
if(typeof this.subList !== ‘undefined’ && this.subList !== null){
_forEach.call(this.subList,(sub)=>{
if(typeof sub !== ‘undefined’ && sub !== null){
typeof sub.onReceive === ‘function’ ?
sub.onReceive(msg) :
‘’;
}
})
}
};

function Subscription(name){
this.name = name;

}

Subscription.prototype.onReceive = function(msg){
console.log(this.name + ’ 收到消息 : ’ + msg);
};

let pub = new Publish();
let sub1 = new Subscription(‘sub1’);
let sub2 = new Subscription(‘sub2’);
let sub3 = new Subscription(‘sub3’);
let sub4 = new Subscription(‘sub4’);

pub.addSub(sub1);
pub.addSub(sub1);
pub.addSub(sub2);
pub.addSub(sub3);
pub.addSub(sub4);

pub.notifyAll(‘这是一条全部推送的消息’);
// sub1 收到消息 : 这是一条全部推送的消息
// sub2 收到消息 : 这是一条全部推送的消息
// sub3 收到消息 : 这是一条全部推送的消息
// sub4 收到消息 : 这是一条全部推送的消息

pub.notifySingle(sub2,“这是一条单独推送的消息”);
// sub2 收到消息 : 这是一条单独推送的消息

pub.removeSub(sub3);

pub.notifyAll(‘这是一条全部推送的消息’);
// sub1 收到消息 : 这是一条全部推送的消息
// sub2 收到消息 : 这是一条全部推送的消息
// sub4 收到消息 : 这是一条全部推送的消息
sub1.onReceive === sub2.onReceive;//true
sub1.onReceive === sub3.onReceive;//true
sub1.onReceive === sub4.onReceive;//true
sub2.onReceive === sub3.onReceive;//true
sub2.onReceive === sub4.onReceive;//true
sub3.onReceive === sub4.onReceive;//true
改进版本与之前的版本相比有一个特点:拥有同一构造函数的对象,属性是唯一的,行为是一致的[5]。所有对象都拥有独立于其它对象的属性,却存在相同的行为。这正是因为在改进版本中,方法存在于构造函数的prototype属性值上,其将被其创建的对象所继承。也正是因为如此,尽管此时的sub1、sub2、sub3、sub4中都不包含onReceive方法,但也可以通过继承的原型对象Subscription.prototype去达到调用onReceive的目的。而且修改Subscription.prototype上的onReceive方法是可以马上作用到sub1、sub2、sub3、sub4上的。将方法定义到构造函数的prototype属性值上,就可以让拥有相同构造函数的不同对象都具备相同的行为以达到代码复用目的。

instanceof关键字判断对象类型的依据是什么?
我在深入了解JavaScript中基于原型(prototype)的继承机制中声明了函数Person,并以它为构造函数创建了person对象。

function Person(){

}
let person = new Person();
person对象的继承Person函数的prototype属性值,而Person函数的prototype属性值又继承Object函数的prototype属性值,这种一层一层继承的关系构成了原型链。

instanceof关键字判断对象类型的依据便是判断函数的prototype属性值是否存在于对象的原型链上。

正如Person函数的prototype属性值和Object函数的prototype属性值都存在于person对象的原型链上,所以使用instanceof判断两者都为true。

person instanceof Person;//true
person instanceof Object;//true
而Function函数的prototype属性值不存在于person对象的原型链上,所以使用instanceof判断Function函数为false。

person instanceof Function;//false
最后,完成一个instanceof。

/**

  • obj 变量
  • fn 构造函数
    */
    function myInstanceof(obj,fn){
    let _prototype = Object.getPrototypeOf(obj);
    if(null === _prototype){
    return false;
    }
    let _constructor = _prototype.constructor;
    if(_constructor === fn){
    return true;
    }
    return myInstanceof(_prototype,fn);
    }

//测试代码
myInstanceof({},Object);//true
myInstanceof([],Array);//true
myInstanceof(window,Window);//true
myInstanceof(new Map(),Map);//true
myInstanceof({},Array);//false
myInstanceof({},Function);//false
大功告成。

结尾
这3个问题的解答分别对原型和原型链的含义以及它们在JavaScript中起到了什么作用进行了阐述。不过由于本人才疏学浅,难免会遇到一些我个人理解亦或是表达存在错误的地方,还望各位遇到之时,能不吝指出。

虽然__proto__已经被不推荐使用,但是为了更直观,我在此文中获取对象原型的方法都将通过对象的__proto__属性,还望悉知。 ↩︎

Object.prototype继承的原型指向null。 ↩︎

Object.prototype的原型为null,它是原型链的顶点,查到Object.prototype的原型时还找不到便会报找不到了。 ↩︎

对象obj的原型为obj的构造函数的prototype属性,也就是Object.prototype。 ↩︎

这里的属性意指除方法外的属性,行为意指方法。 ↩︎

ANSYS Icepak电子散热基础教程+ANSYS Icepak进阶应用导航案例.zip相关推荐

  1. icepak计算机机箱热仿真,ANSYS Icepak电子散热基础教程

    第1章 ANSYS Icepak概述 1.1 ANSYS Icepak概述及工程应用 1.2 ANSYS Icepak与ANSYS Workbench关系 1.2.1 ANSYS Workbench平 ...

  2. 30096大学计算机应用基础,30096电电子技术基础教程(第2版)2.ppt

    30096电电子技术基础教程(第2版)2 第2章 C语言程序设计的初步知识 2.2.1标识符 C语言中的标识符可以分为系统定义标识符和用户定义标识符. 系统定义标识符 关键字 关键字是C语言系统使用的 ...

  3. eureka hostname作用_SpringCloud基础教程(三)-Eureka进阶

       我的博客:http://www.hao127.com.cn/,欢迎浏览博客!    上一章 http://hao127.com.cn/#/view/65当中,我们介绍了微服务组件当中的服务注册和 ...

  4. yml eureka defaultzone 只生效第一个_SpringCloud基础教程(三)-Eureka进阶

       我的博客:http://www.hao127.com.cn/,欢迎浏览博客!    上一章 http://hao127.com.cn/#/view/65当中,我们介绍了微服务组件当中的服务注册和 ...

  5. SpringCloud 基础教程(八)-Hystrix熔断器(上)

      我的博客:兰陵笑笑生,欢迎浏览博客!  上一章 SpringCloud基础教程(七)-声明式服务调用Fegign当中,我们介绍了使用Fegin更加简化的实现服务间的调用.本章节我将继续探索Hyst ...

  6. hystrix threadpool coresize_SpringCloud 基础教程(八)-Hystrix熔断器(上)

    我的博客:兰陵笑笑生,欢迎浏览博客! 关注公众号:"程序员笑笑生", 回复 "Spring Cloud"."Spring Boot" 获取 ...

  7. 尚硅谷Redis6基础教程-秒杀案例中库存遗留问题

    尚硅谷redis6基础教程中视频24-27的秒杀案例,使用Redis乐观锁解决了超卖问题,但是也产生了库存遗留问题.引入Lua脚本,解决了超卖和库存遗留.Lua脚本为什么解决了库存遗留问题???

  8. 大学计算机教程 曾俊,大学计算机基础教程:曾俊//李柳柏 : 电子电脑 :计算机技术 :计算机原理与基础 :浙江新华书店网群...

    导语 曾俊和李柳柏主编的<大学计算机基础教程>针对CCT和NCRE考试,对大学计算机基础教学的基本内容做了基础性和科学性研究,既精辟地讲解了计算机的基础知识,又突出了计算机的实际应用和操作 ...

  9. ANSYS workbench 19.0基础到实例仿真分析视频教程

    ANSYS workbench 19.0基础到实例仿真分析视频教程 链接:https://pan.baidu.com/s/1Fi7rdlmQ0oE5i_qx1NXEbA 提取码:gezg

  10. 全国计算机二级vb 文库,全国计算机等级考试二级VB基础教程电子教案.ppt

    全国计算机等级考试二级VB基础教程电子教案.ppt ,Visual Basic程序设计基础教程 电子教案,制作人曾强聪,2004 年 4 月,课程内容,第 1 章,第 2 章,第 3 章,第 4 章, ...

最新文章

  1. 在CentOS7上编译GreenPlum5.3.0
  2. Codeforces Round #321 (Div. 2) E
  3. c语言中的无符号字节,C语言之有符号数和无符号数
  4. UVA 1599 Ideal Path
  5. Pandas 文件读取和导出
  6. iOS开发之网络编程--获取文件的MIMEType
  7. 基于OEA框架的客户化设计(一) 总体设计
  8. 8.19 NOIP模拟测试26(B) 嚎叫响彻在贪婪的厂房+主仆见证了 Hobo 的离别+征途堆积出友情的永恒...
  9. Vue实现简单Tab标签页组件
  10. Linux 常用命令 权限管理命令
  11. 鸿蒙2.0公测版支持机型,华为鸿蒙2.0露真容,公测版支持机型公布
  12. 高仿TIMI页面易语言源码-已对接易游网络验证
  13. Python机器视觉--OpenCV入门--机器视觉与OpencCV用途简介
  14. iTop-4412 SCP 精英版 linux-4.14.12 内核移植(2)
  15. 基础 八大疑问词+翻译
  16. 【千锋Python2205班9.26笔记-day06-列表(一阶段)】
  17. 帝国cms html5 编辑器,帝国cms后台编辑器自动排版插件
  18. CAN通信稳定性开发分析
  19. 【雕爷学编程】Arduino动手做(107)---PCF8574扩展板模块
  20. Vector Davinci Developer(RTE) Usage Introduction

热门文章

  1. XboxOne和PS4
  2. 普渡大学电子和计算机工程专业,2020年普渡大学热门专业
  3. 「总结」最全2万字长文解读7大方向人脸数据集v2.0版
  4. 【FFmpeg系列】使用FFmpeg实现视频图像旋转、翻转或转置
  5. php中大于等于的表示方法,php:判断php版本是否大于等于某个版本的方法
  6. java 熄灯问题_遍历搜索空间的例子:熄灯问题
  7. 取值范围的计算 以及为何16位int类型范围是- 32768 ~ 32767 8位类型取值范围为什么是-128~127
  8. 水星如何设置虚拟机服务器,水星mercury路由器电脑怎么设置?
  9. 计算机图形学原理与实践 答案,知到高级计算机图形学原理与实践单元测试答案...
  10. 工作经验的Java学习心得