Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >全面理解面向对象的 JavaScript

全面理解面向对象的 JavaScript

作者头像
庞小明
发布于 2018-03-07 07:28:52
发布于 2018-03-07 07:28:52
1.1K00
代码可运行
举报
文章被收录于专栏:pangguomingpangguoming
运行总次数:0
代码可运行

前言

当今 JavaScript 大行其道,各种应用对其依赖日深。web 程序员已逐渐习惯使用各种优秀的 JavaScript 框架快速开发 Web 应用,从而忽略了对原生 JavaScript 的学习和深入理解。所以,经常出现的情况是,很多做了多年 JS 开发的程序员对闭包、函数式编程、原型总是说不清道不明,即使使用了框架,其代码组织也非常糟糕。这都是对原生 JavaScript 语言特性理解不够的表现。要掌握好 JavaScript,首先一点是必须摒弃一些其他高级语言如 Java、C# 等类式面向对象思维的干扰,全面地从函数式语言的角度理解 JavaScript 原型式面向对象的特点。把握好这一点之后,才有可能进一步使用好这门语言。本文适合群体:使用过 JS 框架但对 JS 语言本质缺乏理解的程序员,具有 Java、C++ 等语言开发经验,准备学习并使用 JavaScript 的程序员,以及一直对 JavaScript 是否面向对象模棱两可,但希望知道真相的 JS 爱好者。

重新认识面向对象

为了说明 JavaScript 是一门彻底的面向对象的语言,首先有必要从面向对象的概念着手 , 探讨一下面向对象中的几个概念:

  • 一切事物皆对象
  • 对象具有封装和继承特性
  • 对象与对象之间使用消息通信,各自存在信息隐藏

以 这三点做为依据,C++ 是半面向对象半面向过程语言,因为,虽然他实现了类的封装、继承和多态,但存在非对象性质的全局函数和变量。Java、C# 是完全的面向对象语言,它们通过类的形式组织函数和变量,使之不能脱离对象存在。但这里函数本身是一个过程,只是依附在某个类上。

然而,面 向对象仅仅是一个概念或者编程思想而已,它不应该依赖于某个语言存在。比如 Java 采用面向对象思想构造其语言,它实现了类、继承、派生、多态、接口等机制。但是这些机制,只是实现面向对象编程的一种手段,而非必须。换言之,一门语言可 以根据其自身特性选择合适的方式来实现面向对象。所以,由于大多数程序员首先学习或者使用的是类似 Java、C++ 等高级编译型语言(Java 虽然是半编译半解释,但一般做为编译型来讲解),因而先入为主地接受了“类”这个面向对象实现方式,从而在学习脚本语言的时候,习惯性地用类式面向对象语 言中的概念来判断该语言是否是面向对象语言,或者是否具备面向对象特性。这也是阻碍程序员深入学习并掌握 JavaScript 的重要原因之一。

实际上,JavaScript 语言是通过一种叫做 原型(prototype)的方式来实现面向对象编程的。下面就来讨论 基于类的(class-based)面向对象基于原型的 (prototype-based) 面向对象这两种方式在构造客观世界的方式上的差别。

基于类的面向对象和基于原型的面向对象方式比较

在基于类的面向对象方式中,对象(object)依靠 类(class)来产生。而在基于原型的面向对象方式中,对象(object)则是依靠 构造器(constructor)利用 原型(prototype)构造出来的。举个客观世界的例子来说明二种方式认知的差异。例如工厂造一辆车,一方面,工人必须参照一张工程图纸,设计规定这辆车应该如何制造。这里的工程图纸就好比是语言中的 类 (class),而车就是按照这个 类(class)制造出来的;另一方面,工人和机器 ( 相当于 constructor) 利用各种零部件如发动机,轮胎,方向盘 ( 相当于 prototype 的各个属性 ) 将汽车构造出来。

事实上关于这两种方式谁更为彻底地表达了面向对象的思想,目前尚有争论。但笔者认为原型式面向对象是一种更为彻底的面向对象方式,理由如下:

首先,客观世界中的对象的产生都是其它实物对象构造的结果,而抽象的“图纸”是不能产生“汽车”的,也就是说,类是一个抽象概念而并非实体,而对象的产生是一个实体的产生;

其次,按照一切事物皆对象这个最基本的面向对象的法则来看,类 (class) 本身并不是一个对象,然而原型方式中的构造器 (constructor) 和原型 (prototype) 本身也是其他对象通过原型方式构造出来的对象。

再 次,在类式面向对象语言中,对象的状态 (state) 由对象实例 (instance) 所持有,对象的行为方法 (method) 则由声明该对象的类所持有,并且只有对象的结构和方法能够被继承;而在原型式面向对象语言中,对象的行为、状态都属于对象本身,并且能够一起被继承(参考资源),这也更贴近客观实际。

最 后,类式面向对象语言比如 Java,为了弥补无法使用面向过程语言中全局函数和变量的不便,允许在类中声明静态 (static) 属性和静态方法。而实际上,客观世界不存在所谓静态概念,因为一切事物皆对象!而在原型式面向对象语言中,除内建对象 (build-in object) 外,不允许全局对象、方法或者属性的存在,也没有静态概念。所有语言元素 (primitive) 必须依赖对象存在。但由于函数式语言的特点,语言元素所依赖的对象是随着运行时 (runtime) 上下文 (context) 变化而变化的,具体体现在 this 指针的变化。正是这种特点更贴近 “万物皆有所属,宇宙乃万物生存之根本”的自然观点。在 程序清单 1window 便类似与宇宙的概念。

清单 1. 对象的上下文依赖
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 <script> 
 var str = "我是一个 String 对象 , 我声明在这里 , 但我不是独立存在的!"
 var obj = { des: "我是一个 Object 对象 , 我声明在这里,我也不是独立存在的。" }; 
 var fun = function() { 
    console.log( "我是一个 Function 对象!谁调用我,我属于谁:", this ); 
 }; 

 obj.fun = fun; 

 console.log( this === window );     // 打印 true 
 console.log( window.str === str );  // 打印 true 
 console.log( window.obj === obj );  // 打印 true 
 console.log( window.fun === fun );  // 打印 true 
 fun();                              // 打印 我是一个 Function 对象!谁调用我,我属于谁:window 
 obj.fun();                          // 打印 我是一个 Function 对象!谁调用我,我属于谁:obj 
 fun.apply(str);                   // 打印 我是一个 Function 对象!谁调用我,我属于谁:str 
 </script>

在接受了面向对象存在一种叫做基于原型实现的方式的事实之后,下面我们就可以来深入探讨 ECMAScript 是如何依据这一方式构造自己的语言的。

最基本的面向对象

ECMAScript 是一门彻底的面向对象的编程语言(参考资源),JavaScript 是其中的一个变种 (variant)。它提供了 6 种基本数据类型,即 Boolean、Number、String、Null、Undefined、Object。为了实现面向对象,ECMAScript设计出了一种非常成功的数据结构 - JSON(JavaScript Object Notation), 这一经典结构已经可以脱离语言而成为一种广泛应用的数据交互格式 (参考资源)。

应该说,具有基本数据类型和 JSON 构造语法的 ECMAScript 已经基本可以实现面向对象的编程了。开发者可以随意地用 字面式声明(literal notation)方式来构造一个对象,并对其不存在的属性直接赋值,或者用 delete 将属性删除 ( 注:JS 中的 delete 关键字用于删除对象属性,经常被误作为 C++ 中的 delete,而后者是用于释放不再使用的对象 ),如 程序清单 2

清单 2. 字面式 (literal notation) 对象声明
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 var person = { 
    name: “张三”, 
    age: 26, 
    gender: “男”, 
    eat: function( stuff ) { 
        alert( “我在吃” + stuff ); 
    } 
 }; 
 person.height = 176; 
 delete person[ “age” ];

在实际开发过程中,大部分初学者或者对 JS 应用没有太高要求的开发者也基本上只用到 ECMAScript 定义的这一部分内容,就能满足基本的开发需求。然而,这样的代码复用性非常弱,与其他实现了继承、派生、多态等等的类式面向对象的强类型语言比较起来显得 有些干瘪,不能满足复杂的 JS 应用开发。所以 ECMAScript 引入原型来解决对象继承问题。

使用函数构造器构造对象

除了 字面式声明(literal notation)方式之外,ECMAScript 允许通过 构造器(constructor)创建对象。每个构造器实际上是一个 函数(function) 对象, 该函数对象含有一个“prototype”属性用于实现 基于原型的继承(prototype-based inheritance)共享属性(shared properties)对象可以由“new 关键字 + 构造器调用”的方式来创建,如 程序清单 3

清单 3. 使用构造器 (constructor) 创建对象
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 // 构造器 Person 本身是一个函数对象
 function Person() { 
	 // 此处可做一些初始化工作
 } 
 // 它有一个名叫 prototype 的属性
 Person.prototype = { 
    name: “张三”, 
    age: 26, 
    gender: “男”, 
    eat: function( stuff ) { 
        alert( “我在吃” + stuff ); 
    } 
 } 
 // 使用 new 关键字构造对象
 var p = new Person();

由于早期 JavaScript 的发明者为了使这门语言与大名鼎鼎的 Java 拉上关系 ( 虽然现在大家知道二者是雷锋和雷锋塔的关系 ),使用了 new 关键字来限定构造器调用并创建对象,以使其在语法上跟 Java 创建对象的方式看上去类似。但需要指出的是,这两门语言的 new含 义毫无关系,因为其对象构造的机理完全不同。也正是因为这里语法上的类似,众多习惯了类式面向对象语言中对象创建方式的程序员,难以透彻理解 JS 对象原型构造的方式,因为他们总是不明白在 JS 语言中,为什么“函数名可以作为类名”的现象。而实质上,JS 这里仅仅是借用了关键字 new,仅此而已;换句话说,ECMAScript 完全可以用其它 非new 表达式来用调用构造器创建对象。

彻底理解原型链 (prototype chain)

在 ECMAScript 中,每个由构造器创建的对象拥有一个指向构造器 prototype 属性值的 隐式引用(implicit reference),这个引用称之为 原型(prototype)。进一步,每个原型可以拥有指向自己原型的 隐式引用(即该原型的原型),如此下去,这就是所谓的 原型链(prototype chain)参考资源)。在具体的语言实现中,每个对象都有一个 __proto__ 属性来实现对原型的 隐式引用程序清单 4说明了这一点。

清单 4. 对象的 __proto__ 属性和隐式引用
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 function Person( name ) { 
    this.name = name; 
 } 
 var p = new Person(); 
 // 对象的隐式引用指向了构造器的 prototype 属性,所以此处打印 true 
 console.log( p.__proto__ === Person.prototype ); 

 // 原型本身是一个 Object 对象,所以他的隐式引用指向了
 // Object 构造器的 prototype 属性 , 故而打印 true 
 console.log( Person.prototype.__proto__ === Object.prototype ); 

 // 构造器 Person 本身是一个函数对象,所以此处打印 true 
 console.log( Person.__proto__ === Function.prototype );

有了 原型链,便可以定义一种所谓的 属性隐藏机制, 并通过这种机制实现继承。ECMAScript 规定,当要给某个对象的属性赋值时,解释器会查找该对象原型链中第一个含有该属性的对象(注:原型本身就是一个对象,那么原型链即为一组对象的链。对象的 原型链中的第一个对象是该对象本身)进行赋值。反之,如果要获取某个对象属性的值,解释器自然是返回该对象原型链中首先具有该属性的对象属性值。图 1说名了这中隐藏机制:

图 1. 原型链中的属性隐藏机制

在 图 1 中,object1->prototype1->prototype2 构成了 对象 object1 的原型链,根据上述属性隐藏机制,可以清楚地看到 prototype1 对象中的 property4 属性和 prototype2 对象中的 property3 属性皆被隐藏。理解了原型链,那么将非常容易理解 JS 中基于原型的继承实现原理,程序清单 5 是利用原型链实现继承的简单例子。

清单 5. 利用原型链 Horse->Mammal->Animal 实现继承
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 // 声明 Animal 对象构造器
 function Animal() { 
 } 
 // 将 Animal 的 prototype 属性指向一个对象,
 // 亦可直接理解为指定 Animal 对象的原型
 Animal.prototype = { 
    name: animal", 
    weight: 0, 
    eat: function() { 
        alert( "Animal is eating!" ); 
    } 
 } 
 // 声明 Mammal 对象构造器
 function Mammal() { 
    this.name = "mammal"; 
 } 
 // 指定 Mammal 对象的原型为一个 Animal 对象。
 // 实际上此处便是在创建 Mammal 对象和 Animal 对象之间的原型链
 Mammal.prototype = new Animal(); 

 // 声明 Horse 对象构造器
 function Horse( height, weight ) { 
    this.name = "horse"; 
    this.height = height; 
    this.weight = weight; 
 } 
 // 将 Horse 对象的原型指定为一个 Mamal 对象,继续构建 Horse 与 Mammal 之间的原型链
 Horse.prototype = new Mammal(); 

 // 重新指定 eat 方法 , 此方法将覆盖从 Animal 原型继承过来的 eat 方法
 Horse.prototype.eat = function() { 
    alert( "Horse is eating grass!" ); 
 } 
 // 验证并理解原型链
 var horse = new Horse( 100, 300 ); 
 console.log( horse.__proto__ === Horse.prototype ); 
 console.log( Horse.prototype.__proto__ === Mammal.prototype ); 
 console.log( Mammal.prototype.__proto__ === Animal.prototype );

理解清单 5 中对象原型继承逻辑实现的关键在于 Horse.prototype = new Mammal() 和 Mammal.prototype = new Animal() 这两句代码。首先,等式右边的结果是构造出一个临时对象,然后将这个对象赋值给等式左边对象的 prototype 属性。也就是说将右边新建的对象作为左边对象的原型。读者可以将这两个等式替换到相应的程序清单 5 代码最后两行的等式中自行领悟。

JavaScript 类式继承的实现方法

从 代码清单 5 可以看出,基于原型的继承方式,虽然实现了代码复用,但其行文松散且不够流畅,可阅读性差,不利于实现扩展和对源代码进行有效地组织管理。不得不承认,类 式继承方式在语言实现上更具健壮性,且在构建可复用代码和组织架构程序方面具有明显的优势。这使得程序员们希望寻找到一种能够在 JavaScript 中以类式继承风格进行编码的方法途径。从抽象的角度来讲,既然类式继承和原型继承都是为实现面向对象而设计的,并且他们各自实现的载体语言在计算能力上是 等价的 ( 因为图灵机的计算能力与 Lambda 演算的计算能力是等价的 ),那么能不能找到一种变换,使得原型式继承语言通过该变换实现具有类式继承编码的风格呢?

目前一些主流的 JS 框架都提供了这种转换机制,也即类式声明方法,比如 Dojo.declare()、Ext.entend() 等等。用户使用这些框架,可以轻易而友好地组织自己的 JS 代码。其实,在众多框架出现之前,JavaScript 大师 Douglas Crockford 最早利用三个函数对 Function 对象进行扩展,实现了这种变换,关于它的实现细节可以(参考资源)。此外还有由 Dean Edwards实现的著名的 Base.js(参考资源)。值得一提的是,jQuery 之父 John Resig 在搏众家之长之后,用不到 30 行代码便实现了自己的 Simple Inheritance。使用其提供的 extend 方法声明类非常简单。程序清单 6是使用了 Simple Inheritance库实现类的声明的例子。其中最后一句打印输出语句是对 Simple Inheritance实现类式继承的最好说明。

清单 6. 使用 Simple Inheritance 实现类式继承
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 // 声明 Person 类
 var Person = Class.extend( { 
    _issleeping: true, 
    init: function( name ) { 
        this._name = name; 
    }, 
    isSleeping: function() { 
        return this._issleeping; 
    } 
 } ); 
 // 声明 Programmer 类,并继承 Person 
 var Programmer = Person.extend( { 
    init: function( name, issleeping ) { 
        // 调用父类构造函数
        this._super( name ); 
        // 设置自己的状态
        this._issleeping = issleeping; 
    } 
 } ); 
 var person = new Person( "张三" ); 
 var diors = new Programmer( "张江男", false ); 
 // 打印 true 
 console.log( person.isSleeping() ); 
 // 打印 false 
 console.log( diors.isSleeping() ); 
 // 此处全为 true,故打印 true 
 console.log( person instanceof Person && person instanceof Class 
    && diors instanceof Programmer && 
    diors instanceof Person && diors instanceof Class );

如果您已对原型、函数构造器、闭包和基于上下文的 this 有了充分的理解,那么理解 Simple Inheritance 的实现原理也并非相当困难。从本质上讲,var Person = Class.extend(...)该 语句中,左边的 Person 实际上是获得了由 Class 调用 extend 方法返回的一个构造器,也即一个 function 对象的引用。顺着这个思路,我们继续介绍 Simple Inheritance 是如何做到这一点,进而实现了由原型继承方式到类式继承方式的转换的。图 2 是 Simple Inheritance 的源码及其附带注释。为了方便理解,用中文对代码逐行补充说明。

图 2.Simple Inheritance 源码解析

抛开代码第二部分,整体连贯地考察第一和第三部分会发现,extend 函数的根本目的就是要构造一个具有新原型属性的新构造器。我们不禁感叹 John Resig的大师手笔及其对 JS 语言本质把握的细腻程度。至于 John Resig是如何想到这样精妙的实现方法,感兴趣的读者可以阅读本文 (参考资源),其中有详细介绍关于最初设计 Simple Inheritance 的思维过程。

JavaScript 私有成员实现

到 此为止,如果您任然对 JavaScript 面向对象持怀疑态度,那么这个怀疑一定是,JavaScript 没有实现面向对象中的信息隐藏,即私有和公有。与其他类式面向对象那样显式地声明私有公有成员的方式不同,JavaScript 的信息隐藏就是靠闭包实现的。见 程序清单 7:

清单 7. 使用闭包实现信息隐藏
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 // 声明 User 构造器
 function User( pwd ) { 
    // 定义私有属性
    var password = pwd; 
    // 定义私有方法 
    function getPassword() { 
        // 返回了闭包中的 password 
        return password; 
    } 
    // 特权函数声明,用于该对象其他公有方法能通过该特权方法访问到私有成员
    this.passwordService = function() { 
        return getPassword(); 
    } 
 } 
 // 公有成员声明
 User.prototype.checkPassword = function( pwd ) { 
    return this.passwordService() === pwd; 
 }; 
 // 验证隐藏性
 var u = new User( "123456" ); 
 // 打印 true 
 console.log( u.checkPassword( "123456" ) ); 
 // 打印 undefined 
 console.log( u.password ); 
 // 打印 true 
 console.log( typeof u.gePassword === "undefined" );

JavaScript 必须依赖闭包实现信息隐藏,是由其函数式语言特性所决定的。本文不会对函数式语言和闭包这两个话题展开讨论,正如上文默认您理解 JavaScript 中基于上下文的 this 一样。关于 JavaScript 中实现信息隐藏,Douglas Crockford在《 Private members in JavaScript 》(参考资源)一文中有更权威和详细的介绍。

结束语

JavaScript 被认为是世界上最受误解的编程语言,因为它身披 c 语言家族的外衣,表现的却是 LISP 风格的函数式语言特性;没有类,却实也彻底实现了面向对象。要对这门语言有透彻的理解,就必须扒开其 c 语言的外衣,从新回到函数式编程的角度,同时摒弃原有类的面向对象概念去学习领悟它。随着近些年来 Web 应用的普及和 JS 语言自身的长足发展,特别是后台 JS 引擎的出现 ( 如基于 V8 的 NodeJS 等 ),可以预见,原来只是作为玩具编写页面效果的 JS 将获得更广阔发展天地。这样的发展趋势,也对 JS 程序员提出了更高要求。只有彻底领悟了这门语言,才有可能在大型的 JS 项目中发挥她的威力。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2014-10-14 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
PIE-Engine数据:1961–2018年月中国站点尺度天然径流量估算数据集
中国站点尺度天然径流量估算数据集,包括全国多个水文站1961–2018年月值天然径流量(数据将继续更新),数据为ASCII格式。该数据是基于VIC(The Variable Infiltration Capacity)分布式水文模型,结合参数不确定分析、流向校正和统计后处理等数据质量方法重建的,是中国长时序、高质量与时间连续的天然河川径流资料。研究中涉及到的全国水文站分别约有83%和56%水文站的NSE值、KGE值大于0.70。偏差校正后全国站点平均偏差百分比从约17%降至2%,NSE与KGE平均值分别为0.85与0.91。该天然径流数据集质量较高,可以为变化环境下水文过程模拟与水资源综合管理提供重要基础数据与科学服务。前言 – 人工智能教程
此星光明
2024/05/24
3370
PIE-Engine数据:1961–2018年月中国站点尺度天然径流量估算数据集
科研解读 | 新疆大气水汽再循环过程变化及机制研究——姚俊强等,Journal of Hydrology
本成果以“Climatic and associated atmospheric water cycle changes over the Xinjiang, China”发表在国际水文领域SCI期刊Journal of Hydrology上。由中国气象局乌鲁木齐沙漠气象研究所科研团队联合中科院新疆生态与地理研究所、成都信息工程大学和德国洪堡大学等科研单位共同完成,第一作者为中国气象局乌鲁木齐沙漠气象研究所姚俊强副研究员,受到国家重点研发计划项目课题(2018YFA0606403)、国家自然科学基金(U1903208, U1903113, 41975146,U1603113)的共同资助。
气象学家
2020/07/09
1.4K0
科研解读 | 新疆大气水汽再循环过程变化及机制研究——姚俊强等,Journal of Hydrology
全球地表水年度数据集JRC Yearly Water Classification History, v1.4数据集
JRC Yearly Water Classification History, v1.4是一个对全球水资源进行分类的数据集,覆盖了1984年至2019年的时间范围。该数据集是由欧盟联合研究中心(JRC)开发的,使用的数据源是来自Landsat系列卫星的高分辨率图像。数据集根据水体的类型和水体覆盖的百分比进行分类,包括河流、湖泊、人工水体和沼泽等。前言 – 人工智能教程
此星光明
2024/02/02
7440
全球地表水年度数据集JRC Yearly Water Classification History, v1.4数据集
分析训练全球 2k+ 水文站数据,中科院团队发布 ED-DLSTM,实现无监测数据地区洪水预测
中国科学院成都山地灾害与环境研究所欧阳朝军团队,提出了一种全新的基于 AI 的径流洪水预测模型 ED-DLSTM,利用全球超 2 千个水文站数据进行模型训练,以解决全球范围内有监测数据流域和无监测数据流域径流预测问题。
HyperAI超神经
2024/06/04
5880
分析训练全球 2k+ 水文站数据,中科院团队发布 ED-DLSTM,实现无监测数据地区洪水预测
JRC Monthly Water History, v1.4数据集
JRC Monthly Water History产品,是利用1984至2020年获取的landsat5、landsat7和landsat8的卫星影像,生成的一套30米分辨率的全球地表水覆盖的月度地表水监测地图集。该数据集共有442景数据,包含1984年3月至2020年12月间的月度水体检测情况,用户可以在全球尺度上按地区回溯某月份水体检测情况。前言 – 人工智能教程
此星光明
2024/02/02
3150
JRC Monthly Water History, v1.4数据集
基于加拿大降水分析 (CaPA) 系统的北美区域确定性降水数据集
基于加拿大降水分析 (CaPA) 系统的区域确定性降水分析 (RDPA) 的域与业务区域模式相对应,即区域确定性预报系统 (RDPS-LAM3D),但太平洋地区除外其中 RDPA 域的西边边界相对于区域模型域稍微向东移动。RDPA 分析的分辨率与运行区域系统 RDPS LAM3D 的分辨率相同。RDPA GRIB2 数据集中的字段位于覆盖北美和邻近水域的极地立体 (PS) 网格上,分辨率为 10 公里,北纬 60 度,2003 年至今。您可以在此处找到有关该数据集的其他信息,此外,除了气候引擎组织页面之外,您还可以在此处找到有关该数据集的更多信息。前言 – 人工智能教程
此星光明
2024/02/02
1680
基于加拿大降水分析 (CaPA) 系统的北美区域确定性降水数据集
Earth-Science Reviews | 系统揭示新疆气候水文变化及其影响
近年来,新疆地区气候“暖湿化”及影响问题引起科学界和社会大众的广泛关注和讨论,但21世纪以来新疆气候如何变化及影响尚不清楚。针对上述问题,中国气象局乌鲁木齐沙漠气象研究所姚俊强研究员与中科院新疆生态与地理研究所、德国洪堡大学、成都信息工程大学等国内外多家研究机构合作,基于最新的观测资料和多源数据,结合文献综述以及模式模拟预估,系统分析了新疆地区的气候和水文变化,包括气温、降水、极端事件、冰川、湖泊及河流径流等的变化,并从区域水汽源汇及对降水的影响、山盆地形影响下的水汽再循环过程、气候“湿干转折”及生态负效应和荒漠-绿洲过渡带变化等方面系统评述了气候变化对干旱区生态和水文系统的影响。
气象学家
2022/03/31
1K0
Earth-Science Reviews | 系统揭示新疆气候水文变化及其影响
雪数据同化系统Snow Data Assimilation System数据集
雪资料同化系统(SNODAS)是国家水文遥感业务中心(NOHRSC)精心开发的综合建模和资料同化系统。其主要目标是提供高度准确的积雪和相关参数估计,作为水文建模和分析的重要资源。SNODAS 通过吸收各种来源的数据来实现这一目标,包括卫星观测、地面测量和数值天气预报模型。这些不同的数据流在雪质量和能量平衡模型中经过彻底处理,最终产生雪水当量(SWE)、雪深、雪覆盖范围和雪反照率的估计值。
此星光明
2024/02/02
2320
雪数据同化系统Snow Data Assimilation System数据集
全球地表水数据集JRC Global Surface Water Mapping Layers v1.4
JRC Global Surface Water Mapping Layers产品,是利用1984至2020年获取的landsat5、landsat7和landsat8的卫星影像,生成分辨率为30米的一套全球地表水覆盖的地图集。用户可以在全球尺度上按地区回溯某个时间上地表水分的变化情况。产品由包含7个波段的图像组成,反映了过去35年间地表水在空间和时间的分布情况。
此星光明
2024/02/02
6010
全球地表水数据集JRC Global Surface Water Mapping Layers v1.4
GEE数据集——全球 30 米不透水表面动态数据集 (GISD30)
全球 30 米不透水表面动态数据集 (GISD30) 为了解 1985 年至 2020 年全球不断变化的不透水表面景观提供了宝贵的资源。该数据集在城市可持续发展、人为碳排放评估和全球生态环境建模等领域具有深远的科学意义和实际应用价值。GISD30 是通过一种创新的自动化方法精心创建的,该方法充分利用了光谱泛化和自动样本提取策略的优势。该数据集利用谷歌地球引擎云计算平台上的时间序列大地遥感卫星图像,提供了有关不透水表面动态的全面见解。前言 – 人工智能教程
此星光明
2024/02/29
5170
GEE数据集——全球 30 米不透水表面动态数据集 (GISD30)
近期发布的地理空间数据共享资源汇总
地表覆盖分布是气候变化研究、生态环境评估及地理国情监测等不可或缺的重要基础信息。近年来,随着卫星遥感和计算机存储与计算能力的不断增强,全球尺度中高分辨率地表覆盖产品的应用需求日益迫切。
遥感大数据学习
2022/09/20
1.9K0
近期发布的地理空间数据共享资源汇总
全球日值气象数据集
全球日值气象数据集(GLDAS Catchment Land Surface Model L4 daily 0.25 x 0.25 degree GRACE-DA1 V2.2 ,简称GLDAS_CLSM025_DA1_D),时空分辨率分别为1天、0.25度。 GLDAS-2.2目前包括来自CLSM-F2.5和GRACE-DA的产品,其中GRACE-DA数据范围为2003年至今。根据与ECMWF的数据协议,此GLDAS-2.2日产品不包括气象强迫字段。GLDAS-2.2 数据以NetCDF格式存档和分发。前言 – 人工智能教程
此星光明
2024/02/02
2360
全球 30 米不透水表面动态数据集 (GISD30)
全球 30 米不透水表面动态数据集 (GISD30) 为了解 1985 年至 2020 年全球不断变化的不透水表面景观提供了宝贵的资源。该数据集在城市可持续发展、人为碳排放评估和全球生态环境建模等领域具有深远的科学意义和实际应用价值。GISD30 是通过一种创新的自动化方法精心创建的,该方法充分利用了光谱泛化和自动样本提取策略的优势。该数据集利用谷歌地球引擎云计算平台上的时间序列大地遥感卫星图像,提供了有关不透水表面动态的全面见解。前言 – 人工智能教程
此星光明
2024/02/21
2450
中国1km分辨率逐月降水数据集(1901-2020)
中国逐月降水量数据集(1901-2021)是根据CRU发布的全球0.5°气候数据集以及WorldClim发布的全球高分辨率气候数据集,通过Delta空间降尺度方案在中国地区降尺度生成的。使用了496个独立气象观测点数据进行验证,验证结果可信。数据集的空间分辨率为0.0083333°(约1km),降水单位为0.1mm,包含全国主要陆地(包含港澳台地区),不含南海岛礁等区域。
此星光明
2024/02/02
5440
中国1km分辨率逐月降水数据集(1901-2020)
GEE数据集——全球( 30 弧秒)尺度地下水模型GLOBGM v1.0数据集
GLOBGM v1.0 数据集是全球地下水建模的一个重要里程碑,提供了 30 弧秒 PCR-GLOBWB-MODFLOW 模型的并行实施。该数据集由 Jarno Verkaik 等人开发,以赤道约 1 公里的空间分辨率全面展示了全球地下水动态。该数据集利用两个模型层和 MODFLOW 6 框架,利用现有的 30′′ PCR-GLOBWB 数据进行模拟,使研究人员能够探索全球范围的地下水流动态。计算实现采用消息传递接口并行化,便于在分布式内存并行集群上进行高效处理。
此星光明
2024/03/18
1K0
GEE数据集——全球( 30 弧秒)尺度地下水模型GLOBGM v1.0数据集
GLanCE30 v001全球土地分类数据集,分辨率 30 m
NASA 制作用于研究环境的地球系统数据记录 (MEaSURE) 全球土地覆盖绘图和估算 (GLanCE)每年30米(m)版本1数据产品提供来自Landsat 5专题制图器(TM)、Landsat 7增强型专题制图器Plus( ETM+)和 Landsat 8 运行陆地成像仪 (OLI)。这些地图为用户社区提供土地覆盖类型、土地覆盖变化、表征每个像素绿化程度和季节性的指标以及变化幅度。 GLanCE 数据产品将使用一组七个大陆网格提供,这些网格使用参数化的兰伯特方位角等面积投影,以最大限度地减少每个大陆的失真。目前,北美和欧洲大陆均可用。该数据集可用于广泛的应用,包括生态系统、气候和水文建模;监测陆地生态系统对气候变化的反应;碳核算;和土地管理。
此星光明
2024/02/02
2430
GLanCE30 v001全球土地分类数据集,分辨率 30 m
国家青藏高原科学数据中心研制和发布全球农业灌溉用水数据集
近期,中国科学院青藏高原研究所李新研究员团队(张琨、李新、郑东海等)联合中国科学院西北生态环境资源研究院(张凌)与兰州大学(朱高峰),发展了一套基于多源卫星产品估算全球农业灌溉用水量的方法与数据集,相关论文发表在《Water Resources Research》期刊,国家青藏高原科学数据中心(https://data.tpdc.ac.cn)作为该论文的数据仓储,目前已在线发布相应的数据集,用户可开放获取(https://doi.org/10.11888/hydro.tpdc.271220),数据空间分辨率为25公里,时间跨度为2011-2018。
气象学家
2022/04/18
1.8K0
国家青藏高原科学数据中心研制和发布全球农业灌溉用水数据集
CNN-LSTM | 一种融合卫星-雨量站降水数据的时空深度融合模型
降水作为水循环的重要组成部分,在连接生物圈、水圈、岩石圈和大气圈等方面发挥着重要作用。降水的空间分布极其复杂,这对气象、水文及其相关过程有着深远的影响。因此,定量降水估计(QPE)的精度对于水文、气象、气候、农业、生态和自然灾害防治等都具有重要意义。为了提高定量降水估计的精度,已经开发了许多用于融合卫星数据和观测降水数据的模型。然而,已有的融合方法大多单独考虑卫星数据和雨量站数据的空间或时间相关性,融合后的降水数据仍然受到空间分辨率低和区域精度不高的限制。
bugsuse
2020/12/16
7.4K0
CNN-LSTM | 一种融合卫星-雨量站降水数据的时空深度融合模型
北师大研究团队建立 ECA-Net 模型,预测中国未来 70 年的风能利用潜力
来自北京师范大学环境学院的研究团队建立了 ECA-Net 降尺度模型,并利用 2006 年至 2010 年的数据对建立的模型进行验证,进而预测我国本世纪的风能利用潜力。
HyperAI超神经
2024/03/13
1540
北师大研究团队建立 ECA-Net 模型,预测中国未来 70 年的风能利用潜力
NASA数据集——1980 年至 2020 年北美 3km分辨率气温(摄氏度)、相对湿度(%)、风速(米/秒)、风向(真北偏角)、总降水量(雨+雪)等数据集
Daily SnowModel Outputs Covering the ABoVE Core Domain, 3-km Resolution, 1980-2020
此星光明
2024/05/24
1370
NASA数据集——1980 年至 2020 年北美 3km分辨率气温(摄氏度)、相对湿度(%)、风速(米/秒)、风向(真北偏角)、总降水量(雨+雪)等数据集
推荐阅读
PIE-Engine数据:1961–2018年月中国站点尺度天然径流量估算数据集
3370
科研解读 | 新疆大气水汽再循环过程变化及机制研究——姚俊强等,Journal of Hydrology
1.4K0
全球地表水年度数据集JRC Yearly Water Classification History, v1.4数据集
7440
分析训练全球 2k+ 水文站数据,中科院团队发布 ED-DLSTM,实现无监测数据地区洪水预测
5880
JRC Monthly Water History, v1.4数据集
3150
基于加拿大降水分析 (CaPA) 系统的北美区域确定性降水数据集
1680
Earth-Science Reviews | 系统揭示新疆气候水文变化及其影响
1K0
雪数据同化系统Snow Data Assimilation System数据集
2320
全球地表水数据集JRC Global Surface Water Mapping Layers v1.4
6010
GEE数据集——全球 30 米不透水表面动态数据集 (GISD30)
5170
近期发布的地理空间数据共享资源汇总
1.9K0
全球日值气象数据集
2360
全球 30 米不透水表面动态数据集 (GISD30)
2450
中国1km分辨率逐月降水数据集(1901-2020)
5440
GEE数据集——全球( 30 弧秒)尺度地下水模型GLOBGM v1.0数据集
1K0
GLanCE30 v001全球土地分类数据集,分辨率 30 m
2430
国家青藏高原科学数据中心研制和发布全球农业灌溉用水数据集
1.8K0
CNN-LSTM | 一种融合卫星-雨量站降水数据的时空深度融合模型
7.4K0
北师大研究团队建立 ECA-Net 模型,预测中国未来 70 年的风能利用潜力
1540
NASA数据集——1980 年至 2020 年北美 3km分辨率气温(摄氏度)、相对湿度(%)、风速(米/秒)、风向(真北偏角)、总降水量(雨+雪)等数据集
1370
相关推荐
PIE-Engine数据:1961–2018年月中国站点尺度天然径流量估算数据集
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验