手机版

分享Javascript继承机制的设计思路

时间:2021-10-18 来源:互联网 编辑:宝哥软件园 浏览:

我一直很难理解Javascript语言的继承机制。它没有“子类”和“父类”的概念,也没有区分“类”和“实例”。它依靠一种非常奇特的‘原型链’模式来实现继承。我花了很多时间研究这一部分,做了很多笔记。但都是强迫记忆,无法从根本上理解。

直到昨天看了法国程序员Vjeux的解释,才突然意识到为什么Javascript是这样设计的。接下来,我尝试用自己的语言解释它的设计思想。完全理解原型对象的含义。其实一点也不复杂。道理很简单。1.要理解Javascript从古至今的设计思想,必须从它的诞生开始。1994年,网景发布了0.9版本的Navigator浏览器。这是历史上第一款成熟的网页浏览器,轰动一时。但是,这个版本的浏览器只能用于浏览,不具备与访问者交互的能力。比如网页上需要填写“用户名”一栏,浏览器无法判断访问者是否真的填写了,只有服务器才能判断。如果没有填写,服务器会返回错误,要求用户重新填写,浪费时间和服务器资源。

因此,网景急需一种网页脚本语言,让浏览器可以与网页进行交互。工程师布兰登艾希负责开发这种新语言。他觉得没有必要设计得很复杂,语言只需要完成一些简单的操作,比如判断用户是否填好了表格。

1994年是面向对象编程最繁荣的时期,C语言是当时最流行的语言,第二年Java语言1.0版本即将推出,Sun公司正在下大力气。布兰登艾希无疑受到了影响。Javascript中的所有数据类型都是对象,这与Java非常相似。然而,他马上遇到了一个难题。你想设计一个“继承”机制吗?第二,Brendan Eich的选择,如果真的是简单的脚本语言,不需要‘继承’机制。但是,Javascript充满了对象,所以必须有一种机制来连接所有对象。因此,布兰登艾希最终设计了“继承”。但是,他并不打算引入“类”的概念,因为一旦有了“类”,Javascript将是一种完整的面向对象编程语言,这似乎有点过于形式化,让初学者更难入门。他认为C语言和Java语言都使用新的命令来生成实例。c写成:class name * object=new class name(param);Java的写法是:foo foo=new foo();因此,他将新命令引入到Javascript中,从原型对象生成实例对象。但是,Javascript没有‘类’,那么如何表示原型对象呢?这时,他想到当C和Java使用新命令时,他们会调用‘类’的构造函数。他做了一个简化的设计。在Javascript语言中,新命令后面不是类,而是构造函数。例如,现在有一个名为dog的构造函数,它代表了DOG对象的原型。函数DOG(name){ this . name=name;}在此构造函数上使用new将生成dog对象的实例。Var dogA=new DOG('大毛');alert(DogA . name);//Heavy hair关注构造函数中的这个关键字,它代表新创建的实例对象。三.新运算符的缺点使用构造函数生成实例对象有一个缺点,那就是不能共享属性和方法。例如,在DOG对象的构造函数中,设置实例对象的公共属性种类。函数DOG(name){ this . name=name;本种='犬科';}然后,生成两个实例对象:var dogA=new DOG(‘大毛’);Var dogB=new DOG('两根头发');这两个物体的物种属性是独立的。修改其中一个不会影响另一个。DogA.species='猫科动物';alert(DogB . species);//显示“犬科”,不受dogA影响。每个实例对象都有自己的属性和方法副本。这不仅无法共享数据,而且极大的浪费了资源。四.原型属性介绍考虑到这一点,Brendan Eich决定为构造函数设置一个原型属性。该属性包含一个对象(以下简称“原型对象”),实例对象需要共享的所有属性和方法都放在该对象中;不需要共享的属性和方法放在构造函数中。一旦创建了实例,它将自动引用原型对象的属性和方法。也就是说,实例对象的属性和方法有两种,一种是局部的,一种是引用的。以DOG构造函数为例,现在用原型属性重写:function dog (name) {this。name=name}DOG.prototype={species : '犬科' };Var dogA=new DOG('大毛');Var dogB=new DOG('两根头发');alert(DogA . species);//犬类警报(DogB . species);//犬科现在,物种属性放在原型对象中,由两个实例对象共享。只要原型对象被修改,它就会同时影响两个实例对象。DOG.prototype.species='猫科动物';alert(DogA . species);//猫科动物警报(dogB .物种);//cat v . summary由于所有实例对象共享同一个原型对象,从外部看,原型对象似乎是实例对象的原型,而实例对象似乎“继承”了原型对象。这是Javascript继承机制的设计思路。不知道自己说清楚了没有,继承机制的具体应用可以参考我的系列文章。

版权声明:分享Javascript继承机制的设计思路是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。