《你不知道的javascript》--读书笔记(10)

原型

[[ProtoType]]

JavaScript中对象有一个特殊的[[Prototype]]内置属性,就是对其他对象的引用。

for…in遍历对象时的原理和查找完整条[[Prototype]]链类似 ,任何可以通过原型链访问到的属性都会被枚举。使用in操作符检查属性在对象中是否存在时,同样也会查找整条原型链,无论属性是否可枚举。

Object.prototype

所有普通的[[Prototype]]链都会指向内置的Object.prototype。

属性设置和屏蔽

myObjet.foo = "newman";

foo不直接存在于myObject中而是在于原型链上层时的情况:

  • 如果在 [[Prototype]] 链上层存在名为 foo 的普通数据访问属性(参见第 3 章)并且没有被标记为(writable:false),那就会直接在 myObject 中添加一个名为 foo 的新属性,它是屏蔽属性。

  • 如果在 [[Prototype]] 链上层存在 foo,但是它被标记为只读(writable:false),那么无法修改已有属性或者在myObject 上创建屏蔽属性。如果运行在严格模式下,代码会抛出一个错误。否则,这条赋值语句会被忽略。总之,不会发生屏蔽。

  • 如果在 [[Prototype]] 链上层存在 foo 并且它是一个 setter(参见第 3 章),那就一定会调用这个 setter。 foo 不会被添加到(或者说屏蔽于) myObject,也不会重新定义 foo 这个 setter。

隐式屏蔽

var protoObject = {
    n:1
};

var myObj = Object.create(protoObject);

protoObject.a;//2
myObj.a;//2

protoObject.hasOwnProperty("a");//true
myObj.hasOwnProperty("a")//false

myObj.a++;//隐式屏蔽

protoObject.a;//2
myObj.a;//3
myObj.hasOwnProperty("a")//true

myObj.a++ 相当于 myObj.a = myObj.a + 1,该操作会查找属性a(通过[[Prototype]]),然后给其加1,再用[[Put]]将值赋值给myObj中新建的屏蔽属性a。

继承意味着复制操作,JavaScript并不会复制对象属性。相反,JavaScript会在两个对象之间创建一个关联,这样一个对象就可以通过委托访问另一个对象的属性和函数。

“构造函数”

function Foo(){
    //...
}
Foo.prototype.constructor === Foo;//true

var a = new Foo();
a.constructor === Foo;//true

.constructor引用被委托给了Foo.prototype,而Foo.prototype.constructor默认指向Foo。

a.constructor只是通过默认的[[Prototype]]委托指向Foo,这和"构造"毫无关系。

Foo.constructor的.constructor属性只是Foo函数在声明时的默认属性。若创建了一个新对象并替换了函数默认的.prototype对象引用,新对象并不会自动获得.constructor属性。

函数不是构造函数,但是当且仅当使用new时,函数会变成“构造函数调用”。

两种把Bar.prototype关联到Foo.prototype的方法:

// ES6 之前需要抛弃默认的 Bar.prototype
Bar.ptototype = Object.create( Foo.prototype );
// ES6 开始可以直接修改现有的 Bar.prototype
Object.setPrototypeOf( Bar.prototype, Foo.prototype );

对象关联

[[Prototype]]机制就是存在域对象中的一个内部链,他会引用其他对象。如果在对象上没有找到需要的属性或者方法引用,引擎就
会继续在 [[Prototype]] 关联的对象上进行查找。同理,如果在后者中也没有找到需要的引用就会继续查找它的 [[Prototype]],以此类推。这一系列对象的链接被称为“原型链”。

Object.create(…)

var foo = {
something: function() {
console.log( "Tell me something good..." );
}
};
var bar = Object.create( foo );
bar.something(); // Tell me something good...

Object.create(…)会创建一个新对象并把它关联到我们指定的对象。

小结

  • 访问对象中并不存在的属性,[[Get]]操作会查找对象内部[[Prototype]]关联的对象,此关联关系实际上定义了一条“原型链”,查找属性时会对它进行遍历。

  • 所有普通对象都有内置的Object.prototype,指向原型链顶端,如果在原型链中找不到指定的属性就会停止。

  • 关联两个对象常用方法是使用new关键词进行函数调用。

  • JavaScript不会进行复制(“类继承”),对象之间是通过内部的[[prototype]]链的关联。

  • 对象之间的关系不是复制而是委托。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
一、引言 随着全球气候变化和城市化进程的加快,洪水灾害的频率和强度呈上升趋势,对人类社会和经济发展构成了严重威胁。因此,建设一套高效、准确的洪水预报与防洪形势分析系统,对于提升洪水灾害的预警能力、减轻灾害损失具有重要意义。本文旨在全面总结洪水预报与防洪形势分析系统的设计背景、目标、需求、总体设计、子系统详细设计等方面的内容,为系统的后续开发、实施和应用提供理论支撑和实践指导。 二、建设背景 洪水灾害作为一种常见的自然灾害,其发生往往伴随着巨大的经济损失和人员伤亡。为了有效应对洪水灾害,提高预警和应对能力,各国政府和相关机构纷纷投入大量资源,开展洪水预报和防洪形势分析的研究和实践。在这样的背景下,本项目的建设显得尤为重要和紧迫。通过集成先进的信息技术、水文学、气象学等多学科知识,构建一套集洪水预报、防洪形势分析、专家交互、会商决策于一体的综合性系统,旨在实现对洪水灾害的全面、精准、高效监测和预警,为洪水灾害的应对提供科学依据和技术支持。 三、项目概述 3.1 项目背景 本项目基于上述建设背景,旨在解决洪水灾害预警和应对中存在的问题和挑战。通过建设一套综合性的洪水预报与防洪形势分析系统,实现对洪水灾害的实时监测、预警、分析和决策支持,提高洪水灾害的应对能力和效率。 3.2 项目目标 本项目的核心目标包括: 实现洪水灾害的实时监测和预警,提高预警的准确性和时效性; 提供全面的防洪形势分析功能,为决策支持提供科学依据; 支持专家交互和会商决策,提高决策的科学性和有效性; 构建开放、可扩展的系统架构,支持后续的功能扩展和升级。 3.3 需求概述 为满足项目目标,系统需要满足以下需求: 实时数据采集和处理能力,确保数据的准确性和时效性; 强大的洪水预报和防洪形势分析功能,支持多种预报模型和分析方法; 友好的用户界面和交互体验,方便用户操作和使用; 高效的数据存储和管理能力,支持大规模数据的存储和查询; 可靠的系统性能和稳定性,确保系统的持续运行和可用性。 四、系统总体设计 4.1 基本设计理念 系统总体设计遵循以下基本理念: 以用户需求为导向,注重系统的实用性和易用性; 采用先进的信息技术和水文学、气象学等多学科知识,确保系统的先进性和准确性; 构建开放、可扩展的系统架构,支持后续的功能扩展和升级; 注重系统的稳定性和安全性,确保系统的持续运行和数据安全。 4.2 软件总体结构 系统采用模块化设计,包括数据采集与处理、洪水预报、防洪形势分析、专家交互、会商决策等多个模块。各模块之间通过标准化的接口进行通信和数据交换,实现系统的集成和协同工作。 4.3 系统接口设计 系统接口设计包括外部接口和内部接口两部分。外部接口负责与外部数据源进行通信和数据交换;内部接口负责各模块之间的通信和数据交换。通过标准化的接口设计,实现系统的灵活性和可扩展性。 4.4 系统整体应用模式 系统采用B/S架构,用户通过浏览器访问系统界面,实现远程访问和操作。系统支持多用户并发访问和操作,满足大规模用户的使用需求。 4.5 子系统划分 系统划分为多个子系统,包括应用支撑平台、预报模型建模子系统、洪水预报子系统、专家交互子系统、水库调洪计算子系统、中长期预报子系统、防洪形势分析子系统和会商子系统等。各子系统之间相对独立又相互关联,共同构成完整的洪水预报与防洪形势分析系统。 五、子系统详细设计 5.1 应用支撑平台 应用支撑平台是系统的基础和核心,负责提供用户管理、权限控制、日志管理、数据备份与恢复等基础功能。通过用户与权限设计,实现对用户身份和访问权限的严格控制和管理,确保系统的安全性和稳定性。 5.2 预报模型建模子系统 预报模型建模子系统负责构建和维护洪水预报模型。通过集成多种预报模型和分析方法,实现对洪水灾害的精准预报和分析。子系统包括模型库管理、模型参数设置、模型训练与验证等功能模块。 5.3 洪水预报子系统 洪水预报子系统是系统的核心功能之一,负责根据实时数据和预报模型,对洪水灾害进行实时监测和预警。子系统包括数据采集与处理、洪水预报计算、预警信息发布等功能模块。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值