js原型链理解(求老哥们指点啊啊啊,有没有毛病)

本文深入探讨JavaScript中的原型链机制,包括实例对象的__proto__属性和构造函数的prototype对象,解释了属性查找流程,从实例到构造函数再到Object.prototype的过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  • 所有实例中都存在一个隐式原型对象:__proto__
  • 所有函数中都存在一个显式原型对象:prototype
  • 当实例中查找一个自身不存在的name属性时,会在__proto__对象中去找(也就是构造函数的prototype对象中去找),如果找不到再去上一层的__proto__中去找,直到返回null

function Foo () {
    this.name = "老王"
}

let f1 = new Foo()
console.log(f1.age) // undefined 

Foo.prototype.age = 40
console.log(f1.age) // 40  实例本身没有age属性 会在自身的隐式原型对象__proto__中找(也就是父元素的prototype对象)

console.log(f1.sex) // undefined
Object.prototype.sex = '女'

console.log(f1.sex) // 女    如果自身的__proto__中也不存在,则会去自身的this.__proto__.__proto__对象中找,也就是Object.prototype中找 直至返回null

Foo._proto__ === Object.prototype // true


复制代码


内容概要:本文深入探讨了金属氢化物(MH)储氢系统在燃料电池汽车中的应用,通过建立吸收/释放氢气的动态模型和热交换模型,结合实验测试分析了不同反应条件下的性能表现。研究表明,低温环境有利于氢气吸收,高温则促进氢气释放;提高氢气流速和降低储氢材料体积分数能提升系统效率。论文还详细介绍了换热系统结构、动态性能数学模型、吸放氢特性仿真分析、热交换系统优化设计、系统控制策略优化以及工程验证与误差分析。此外,通过三维动态建模、换热结构对比分析、系统级性能优化等手段,进一步验证了金属氢化物储氢系统的关键性能特征,并提出了具体的优化设计方案。 适用人群:从事氢能技术研发的科研人员、工程师及相关领域的研究生。 使用场景及目标:①为储氢罐热管理设计提供理论依据;②推动车载储氢技术的发展;③为金属氢化物储氢系统的工程应用提供量化依据;④优化储氢系统的操作参数和结构设计。 其他说明:该研究不仅通过建模仿真全面验证了论文实验结论,还提出了具体的操作参数优化建议,如吸氢阶段维持25-30°C,氢气流速0.012g/s;放氢阶段快速升温至70-75°C,水速18-20g/min。同时,文章还强调了安全考虑,如最高工作压力限制在5bar以下,温度传感器冗余设计等。未来的研究方向包括多尺度建模、新型换热结构和智能控制等方面。
<think>我们之前已经定义了一个`trace_real_ray_axial`函数,现在需要计算实际像位置(轴上点)。根据问题描述,我们需要追迹一条通过入瞳边缘的光线(最大孔径光线),并计算其与光轴的交点(即实际像点)相对于最后一个面顶点的位置。但是,请注意,我们之前定义的`trace_real_ray_axial`函数已经完成了这个任务。因此,我们可以直接调用这个函数来得到实际像位置。 然而,为了确保代码的健壮性,我们需要考虑以下几点: 1.光线追迹过程中可能发生全反射,此时应抛出异常或返回一个特殊值。 2.对于无穷远物,初始光线高度由入瞳直径和孔径系数决定;有限远物则由物点、入瞳位置和直径决定。 3.追迹过程中需要处理平面(曲率半径为无穷大)的情况。 根据上述分析,我们直接使用之前实现的`trace_real_ray_axial`函数即可。下面我们给出一个调用示例:```python#假设我们已经有一个OpticalSystem对象systemtry:actual_image_position =trace_real_ray_axial(system)print(f"实际像位置(相对最后一面顶点): {actual_image_position}mm")except Exceptionas e:print(f"光线追迹失败:{str(e)}") ```###完整代码整合为了清晰,我们将之前定义的`trace_real_ray_axial`函数和`OpticalSystem`、`Surface`类放在一起,并给出一个完整的示例。 ```pythonimport mathclass OpticalSystem:def__init__(self):self.surfaces= []#存储光学表面对象self.entrance_pupil_diameter= None#入瞳直径(mm)self.entrance_pupil_position= None#入瞳位置(相对第一个面顶点)(mm)self.object_infinite= True#物在无穷远self.field_angle =None#半视场角()self.object_distance =None#物距(有限远)(mm)self.object_height =None#物高(有限远)(mm)self.aperture_angle= None#孔径角 (有限远) ()self.light_type ="d"#色光类型,默认d光self.aperture_coefficient=1.0#孔径系数self.field_coefficient =1.0#视场系数#计算结果存储self.results ={"focal_length": None,#焦距 f'"ideal_image_distance": None,#理想像距 l'"actual_image_position": None, #实际像位置"image_principal_plane": None, #像方主面位置lH'"exit_pupil_distance": None,#出瞳距 lp'"ideal_image_height": None,#理想像高 y0'"spherical_aberration":None,#球差"longitudinal_chromatic": None, #位置色差"tangential_field_curvature": None,#子午场曲xt'"sagittal_field_curvature": None,#弧矢场曲xs'"astigmatism":None,#像散 Δxts'"actual_image_height": None,#实际像高"relative_distortion":None,#相对畸变"absolute_distortion": None,#绝对畸变"lateral_chromatic": None,#倍率色差"tangential_coma":None#子午慧差} classSurface:def__init__(self, r=float('inf'), d=0.0,nd=1.0,vd=0.0):self.r =r#曲率半径 (mm)self.d =d#厚度/间隔 (mm)self.nd =nd# d光折射率self.vd= vd#阿贝数deftrace_real_ray_axial(system):"""计算轴上点的实际像位置(相对最后一面顶点):param system: OpticalSystem对象,包含系统参数:return:实际像位置(mm)"""#1.确定初始光线参数if system.object_infinite:#无穷远物u0=0.0#初始光线角度(弧度)#最大孔径光线高度(入瞳边缘)h0 =(system.aperture_coefficient* system.entrance_pupil_diameter) /2L0= float('inf')#无穷远物,光线与光轴交点在无穷远else:#有限远物#入瞳边缘高度h_entrance= (system.aperture_coefficient *system.entrance_pupil_diameter)/2#物点位置(相对第一个面顶点)l_object =-system.object_distance#入瞳位置(相对第一个面顶点)L_entrance= system.entrance_pupil_position#计算光线角度d_axis =L_entrance- l_objectu0 =math.atan(h_entrance /d_axis)#计算在第一个面的高度d_to_first =-system.entrance_pupil_positionh0 =h_entrance+ d_to_first* math.tan(u0)L0= system.entrance_pupil_position#初始交点位置#2.初始化追迹参数h =h0u =u0L =L0n_current=1.0#初始介质折射率(空气)#3.遍历所有光学面fori,surf inenumerate(system.surfaces):#获取当前面的曲率半径和折射率r= surf.rnd= surf.nd#使用d光折射率#确定入射和出射折射率n_in =n_currentn_out= ndif n_in ==1.0else1.0#简化处理:空气<->玻璃转换#计算入射角ifabs(u) <1e-10:#平行光ifmath.isinf(r):#平面I=0.0else:c =1.0/rI= math.asin(h *c)else:if math.isinf(r):#平面I =-uelse:ifL ==float('inf'):L_val =h /math.tan(u)else:L_val =Lc=1.0 /rsinI =(L_val -r)* math.sin(u) *c#处理超出[-1,1]范围的情况sinI= max(min(sinI,1.0),-1.0)I= math.asin(sinI)#计算折射角try:sinI_prime =(n_in /n_out) *math.sin(I)#处理全反射情况ifabs(sinI_prime)>1:raiseValueError("全反射发生,无法完成追迹")I_prime= math.asin(sinI_prime)except ZeroDivisionError:I_prime=0.0#计算折射后角度u_prime =u +I -I_prime#计算折射后交点位置ifmath.isinf(r):#平面ifabs(u_prime)>1e-10:L_prime= h/ math.tan(u_prime)else:L_prime =float('inf')else:try:L_prime =r +r *math.sin(I_prime) /math.sin(u_prime)except ZeroDivisionError:L_prime= float('inf')#计算传播到下一面的高度(非最后一面)ifi <len(system.surfaces) -1:d =surf.d#到下一面的距离ifabs(u_prime)>1e-10:h_next= h+ d* math.tan(u_prime)else:h_next =h#平行光高度不变else:h_next =h#最后一面不需要传播#更新参数h =h_nextu =u_prime#更新当前光线距离(注意:如果是最后一个面,则L就是像面位置;否则,减去间隔d,得到的是下一个面的入射光线距离)ifi <len(system.surfaces) -1:L =L_prime- delse:L= L_primen_current =n_out#更新当前介质折射率#4.返回实际像位置(相对最后一面顶点)return L#示例使用if __name__== "__main__":#创建光学系统system =OpticalSystem()system.entrance_pupil_diameter =10.0#入瞳直径10mmsystem.entrance_pupil_position =-50.0#入瞳在第一个面左侧50mmsystem.object_infinite =True#无穷远物system.field_angle =5.0#半视场角5度#添加光学表面surface1= Surface(r=100.0,d=5.0,nd=1.5,vd=60.0)#凸透镜surface2 =Surface(r=-100.0, d=0.0, nd=1.0, vd=0.0)#平面(注意:这里d=0,表示最后一个面后直接到像面)system.surfaces= [surface1, surface2]#计算实际像位置actual_image_pos =trace_real_ray_axial(system)print(f"实际像位置(相对最后一面顶点): {actual_image_pos:.2f} mm") ```###说明:1.在示例中,我们创建了一个简单的双凸透镜系统(两个面:第一个面曲率半径100mm,厚度5mm,折射率1.5;第二个面曲率半径-100mm,厚度0,表示像面在第二个面后0mm处)。2.入瞳直径10mm,位于第一个面左侧50mm处,物在无穷远。3.调用`trace_real_ray_axial`函数计算轴上实际像点位置。###注意事项:-实际光线追迹可能因为全反射而失败,因此使用try-except捕获异常。-对于复杂系统,可能需要考虑更精确的折射率转换(例如,多个玻璃面相邻的情况),上述代码简化了介质转换(假设每个面都是空气到玻璃或玻璃到空气)。如果系统中有多个玻璃面相邻(如胶合透镜),则需要记录每个面后的折射率,并正确传递。§§相关问题§§: 1.如何修改上述代码以支持多波长(例如F光和C光)的追迹? 2.如何计算轴外点的实际像高(即主光线追迹)? 3.如何利用实际光线追迹计算球差? 4.在光线追迹中,如何处理非球面(如二次曲面)?</think>好的,我理解了。既然我们已经有了光线追迹函数,现在需要实现轴上点实际像位置计算的功能。我将直接调用现有的 `trace_real_ray_axial` 函数来实现这个功能。 以下是完整的实现代码: ```python def calculate_actual_image_position(system): """ 计算轴上点的实际像位置(相对最后一面顶点) :param system: OpticalSystem对象,包含系统参数 :return: 实际像位置(mm) """ # 调用光线追迹函数计算实际像位置 actual_image_pos = trace_real_ray_axial(system) # 存储结果到系统对象 system.results["actual_image_position"] = actual_image_pos return actual_image_pos def calculate_spherical_aberration(system): """ 计算球差(轴上点) :param system: OpticalSystem对象 :return: 球差值(mm) """ # 计算理想像距(近轴光线结果) ideal_image_distance = calculate.calculate_ideal_image_distance( system.surfaces, system.object_infinite, system.object_distance ) # 计算主面位置 principal_plane = calculate.calculate_principal_plane_position(system.surfaces) # 计算理想像位置(相对最后一面顶点) ideal_image_pos = ideal_image_distance + principal_plane # 计算实际像位置(轴上点) actual_image_pos = calculate_actual_image_position(system) # 计算球差:实际像位置 - 理想像位置 spherical_aberration = actual_image_pos - ideal_image_pos # 存储结果到系统对象 system.results["spherical_aberration"] = spherical_aberration return spherical_aberration # 示例使用 if __name__ == "__main__": # 创建光学系统 system = OpticalSystem() system.entrance_pupil_diameter = 10.0 # 入瞳直径10mm system.entrance_pupil_position = -50.0 # 入瞳在第一个面左侧50mm system.object_infinite = True # 无穷远物 system.field_angle = 5.0 # 半视场角5度 system.aperture_coefficient = 1.0 # 使用最大孔径 # 添加光学表面 surface1 = Surface(r=100.0, d=5.0, nd=1.5, vd=60.0) # 凸透镜 surface2 = Surface(r=-100.0, d=0.0, nd=1.0, vd=0.0) # 平面 system.surfaces = [surface1, surface2] # 计算实际像位置 actual_image_pos = calculate_actual_image_position(system) print(f"实际像位置(相对最后一面顶点): {actual_image_pos:.2f} mm") # 计算球差 sa = calculate_spherical_aberration(system) print(f"球差: {sa:.4f} mm") ``` ### 代码解释: 1. **`calculate_actual_image_position` 函数**: - 直接调用 `trace_real_ray_axial` 函数计算轴上点的实际像位置 - 将结果存储到系统对象的 `results` 字典中 - 返回实际像位置值 2. **`calculate_spherical_aberration` 函数**: - 使用近轴光线追迹计算理想像位置 - 计算主面位置 - 计算理想像位置(相对最后一面顶点) - 计算实际像位置 - 计算球差:实际像位置 - 理想像位置 - 存储结果并返回球差值 3. **示例使用**: - 创建光学系统对象 - 设置系统参数(入瞳直径、位置、物距等) - 添加光学表面 - 计算实际像位置 - 计算球差 ### 关键点说明: 1. **实际像位置计算**: - 通过追迹一条通过入瞳边缘的光线(最大孔径光线) - 使用实际光线三角追迹公式计算光线与光轴的交点位置 - 该位置即为实际像位置(相对最后一面顶点) 2. **球差计算**: - 球差 = 实际像位置 - 理想像位置 - 理想像位置通过近轴光线追迹计算 - 球差是轴上点单色像差的主要表现形式 3. **结果存储**: - 所有计算结果都存储在系统对象的 `results` 字典中 - 方便后续访问和显示 ### 扩展功能: 如果需要计算位置色差(纵向色差),可以扩展为: ```python def calculate_longitudinal_chromatic(system): """ 计算位置色差(纵向色差) :param system: OpticalSystem对象 :return: 位置色差值(mm) """ # 保存原始色光类型 original_light_type = system.light_type # 计算F光(蓝光)的实际像位置 system.light_type = "F" image_pos_F = calculate_actual_image_position(system) # 计算C光(红光)的实际像位置 system.light_type = "C" image_pos_C = calculate_actual_image_position(system) # 恢复原始色光类型 system.light_type = original_light_type # 计算位置色差:F光像位置 - C光像位置 longitudinal_chromatic = image_pos_F - image_pos_C # 存储结果 system.results["longitudinal_chromatic"] = longitudinal_chromatic return longitudinal_chromatic ``` 这个扩展函数通过计算不同波长光线的实际像位置差,得到系统的位置色差(纵向色差)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值