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

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。 ↩︎

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

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: ANSYS R15 ICEPAK是一款专业的电子散热模拟软件,可以用来优化电子设备散热性能。《ANSYS R15 ICEPAK电子散热基础教程.rar》是一份教程,内容主要为如何使用ICEPAK软件进行电子散热模拟分析,适用于初学者。 该教程包含了软件的安装和使用方法、几何建模、边界条件设置、材料属性定义、网格划分、仿真分析等内容。通过学习这份教程,可以掌握如何使用ICEPAK进行电子散热模拟,了解散热模拟中的一些基本概念和技术,提高设计效率和精度。 但是需要注意的是,散热模拟是一个复杂的问题,需要多方面的知识和经验,单靠一个软件并不能解决所有问题。因此,在使用ICEPAK进行电子散热模拟时,需要结合实际的物理问题和具体的应用背景,认真分析和判断结果,做好实验验证和优化设计工作。 ### 回答2: ANSYS R15 Icepak是一种用于电子散热分析的软件,可以帮助工程师和设计师更好地优化产品的散热性能。这个基础教程RAR包含了关于如何使用ANSYS R15 Icepak进行电子散热分析的基本知识和技巧,对于初学者来说是非常有用的教程资料。 这个教程首先介绍了ANSYS R15 Icepak软件的安装和启动过程,然后通过一个具体的案例,讲解了如何建立模型、设置边界条件和运行仿真等步骤。教程包含了很多实用的建模技巧和仿真优化方法,可以帮助初学者更快地掌握ANSYS R15 Icepak的使用。 此外,这个教程还介绍了ANSYS R15 Icepak软件的一些高级功能,例如如何进行多物理场耦合分析、如何使用扩展功能和如何进行后处理等等。通过这些教程资料的学习,工程师和设计师可以更好地应用ANSYS R15 Icepak软件来解决电子散热分析领域中遇到的各种问题,提高产品的性能和可靠性。 ### 回答3: "ANSYS R15 Icepak电子散热基础教程.rar"是一份电子教程,主要介绍了ANSYS R15 Icepak这款软件在电子散热方面的基础使用方法和技巧。IcepakANSYS公司开发的一款热流模拟软件,主要用于电子散热、风冷却、传感器散热等领域。这个教程主要针对初学者,通过理论知识与实际操作结合的形式,向学习者阐述了ANSYS R15 Icepak软件的使用流程,包括如何进行模型创建、网格划分、边界条件的设置和模拟结果的分析等。 该教程主要内容包括: 1.基础概念介绍:讲解了与电子散热相关的基础概念,如热传递原理、热阻、传热系数等,使读者对电子散热有更全面、深入的认识。 2.软件介绍:该教程介绍了ANSYS R15 Icepak软件的安装和界面操作,通过图文并茂的形式,让读者快速了解软件的主要功能和操作流程。 3.模型创建与网格划分:该章节主要介绍了模型创建和网格划分的基本操作和注意事项,对初学者来说非常实用。 4.边界条件设置:该章节讲解了边界条件的设置方法和技巧,如何设置边界条件才能够更准确地模拟电子散热的情况,这对于工程实践非常有帮助。 5.模拟结果分析:该章节主要介绍了模拟结果的分析方法,包括温度分布图、流速分布图等,通过分析结果,把模拟结果反映到实际工程设计中。 总之,该教程是一份专门针对初学者的ANSYS R15 Icepak电子散热基础教程,深入浅出地讲解了软件的使用方法和技巧,对于想要学习和应用该软件的工程师和学生来说都非常有用。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值