问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

JavaScript 的面向对象的开发能否实现多态?

发布网友 发布时间:2022-04-28 13:13

我来回答

3个回答

热心网友 时间:2022-04-20 07:50

多态性表达为两个方面:类型的模糊与类型的确认(或识别)。在一些高
级语言中,他们分别被表达为“as”和“is”这两个关键词或运算。
JavaScript 是弱 类型 的,通 过 typeof 运算 考察 变量时 ,它 要么是 对象
(object),要么是非对象 (number, undefined, string 等),绝不存在 “像是某个对
象或者某个类”这样的多态问题。反过来说,因为任何一个实例的类型都是
object,因此 JavaScript 这种语言本身就“类型模糊 ”的。
同样由于没有严格的类型检测,因此你可以对任何对象调用任何方法,而
无需考虑它是否“被设计为”拥有该方法。对象的多态性被转换为运行期的动
态特性——例如我们可以动态地添加对象的方法/成员,使它看起来象是某个对象。下面的例子说明这种情况:

function Bird() {
var bird = (arguments.length == 1 ? arguments[0] : this);
bird.wing = 2;
bird.tweet = function() { };
bird.fly = function() {
alert('I can fly.');
}
return bird;
}

// 测试 1: 让一个对象 "fly" ,或让一只 ( 模仿的 ) 鸟 "fly"

var obj = new Object();
var bird = Bird(obj);
bird.fly(); // 能飞
obj.fly(); // 能飞

我们可以在这个例子中看到:obj 是不是 Bird 类型,并不是“fly”的必要前 提——
obj 在创建时,以及通过 Bird(obj)运算转换后,都是一个 Object 类型的对象,
但它是可以“飞(fly)”的 。“能否飞行”只取决于它有没有 fly 方法,而不取决
于它是不是某种类型的对象。
下面我们进述类型识别的问题。
由于所有对象的 typeof 值都是“object”,因此当在某些系统中要确知对象
的具体类型时,就需要使用 instanceof 运算来检测了。在“1.5.4 对象及其成员
的检查”中我们已经讲过该运算,它其实就等效于其它高级语言中的 is 运算。
对于上例来说,如果我们要使对象“能否飞行”取决于它是否是 Bird 构造器
(等义于“类”)产生的实例,那么应该使用类似下面的代码:

// ( 续上例 )
// var obj = new Object();
// var bird = Bird(obj);
function doFly(bird) {
if (bird instanceof Bird) {
obj.fly();
}
else {
throw new Error(' 对象不是 Bird 或其子类的实例 .');
}
}
// 测试 2: Bird 的实例可以 "fly", Object 的实例不能 "fly".
doFly(new Bird()); // 能飞
doFly(bird); // 不能飞

然而多态性中的类型识别还不仅包括这些。另一个关键问题,是在类型继
承中识别父类的同名方法。仍以上面的代码为例,但我们现在遇到的是一只鸵
鸟:

function Ostrich() {
this.fly = function() {
alert('I can\'t fly.');
}
}
Ostrich.prototype = new Bird();
Ostrich.prototype.constructor = Ostrich;
// 演示 : 鸵鸟是鸟,但不能飞
var ostrich = new Ostrich();
doFly(ostrich);

但是对于 doFly()这个函数来说,我们用以识别的表达式是:
(bird instanceof Bird)
这并有没错。因此这里也并不是 instanceof 运算的结果导致“飞”的失败,而
是因为 Ostrich 类的 fly 方法覆盖了父类方法。我们没有理由说 Bird 的子类必
须象 Bird 一样飞得很难看(例如 Phoenix 类一定是很艺术化地飞),而又“可
能”必须具体飞的能力 —— 因此子类必须依赖父类的某些能力来扩展新的方
法。
但是,冲突出现了:我们在实现子类 Ostrich 时已经覆盖了 fly 方法。同样 ,
我们实现 Phoenix 等等类时,也会覆盖这个方法。于是我们想要“依赖父类的
某些方法”时,却发现“找不到这些方法”了。
对于这一点,Delphi 提供了 inherited 语句,并保留了关键字 dynamic(动
态方法)和 virtual(虚方法)。但在 JavaScript 却无法实现相应的功能。简单地
说,如果子类与父类存在同名方法,那么在对象理解“多态特性”时,是应该
视为子类还是父类的方法呢?好的,我们先给出答案。这个*括两个部分:
1. JavaScript 中子类一定是覆盖父类的同名方法的。因此方法同名时,脚本总是
直接调用子类方法;
2. 由于是(动态的)覆盖,所以 JavaScript 中子类方法总是无法调用父类的同 名
方法。
进一步的推论是:JavaScript 无法依赖父类的同名方法(或被子类覆盖的
其它方法)。
继承父类的功能(而非仅是成员名称)是构建复杂的对象系统时所必须的
特性。然而我们看到 JavaScript 自身并不具备这种能力,这与 JavaScript 初始
设计时的主要应用环境有关:它是用于浏览器客户端快速开发的一种脚本语
言,而不是用于构建大型系统的通用语言。
当 JavaScript 用作一种富浏览器客户端(RWC)中的开发语言,或者一种
客户端应用开发的辅助语言(例如插件或外挂脚本)时,它在组织对象系统方
面的缺点就凸显出来,成为噬待解决的问题。本书第二部分将在 Qomo 内核构
建的过程中讨论相关的方法,并解决这些问题。

热心网友 时间:2022-04-20 09:08

1、javascript产生的那个年代里java被宣传的非常火,而网景的整个管理层,都是Java语言的信徒,因此网景做出决策,未来的网页脚本语言必须"看上去与Java足够相似",但是比Java简单,使得非专业的网页作者也能很快上手。所以说js会是基于
javascript,面向对象\多态
1、javascript产生的那个年代里java被宣传的非常火,而网景的整个管理层,都是Java语言的信徒,因此网景做出决策,未来的网页脚本语言必须"看上去与Java足够相似",但是比Java简单,使得非专业的网页作者也能很快上手。所以说js会是基于

热心网友 时间:2022-04-20 10:42

可以参考javascript面向对象编程
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
招商银行的美元天添金怎么样? 天添美蒸馒头为什么开裂呢 上海食堂送菜 邮政跨地区取款手续费多? 谁能告诉我邮政储蓄卡跨省取钱要不要收费啊? 自贡市龙盛世纪仿真模型制造有限公司公司简介 学PS真的很难吗 红烧萝卜牛筋 微信怎么转发公众号部分内容 转发公众号部分内容方法 微信公众号内的视频如何下载?一个F12搞定 javascript 中对象名称如何使用变量 Javascript 面向对象的Class, 怎么写最好. 关于javascript对象属性调用的问题。 javascript 内部对象访问外部对象成员 如何通过javascript对象中的成员变量迭代 如何评价《外科风云》? 特别喜欢吃花甲粉,这个可以自己在家制作吗? 疫情过后爆发的20个行业 如何理解并学习javascript中的面向对象 电信卡不知道号码怎么办 怎么安排美甲师的上班时间 JavaScript面向对象编程 美甲店上班55分成,我一个人上班时间怎么安排,老板说是早上10点到晚上10点我感觉时间太长怎么安排 网上买的手机送我的电信卡我想激活但是不知道手机号码怎么办? javascript中如何动态的获取对象中的成员变量。? 店长如何管理培训内部员工 求助,关于js面向对象成员方法的 花甲粉(家庭版)的做法步骤图,怎么做好吃 谁知美甲培训师岗位职责怎么写 锡纸花甲粉制作需要几步? javascript面向对象编程问题? javascript 变量作为js对象属性使用? background有哪些属性 请问一下怎么样QQ非会员克隆好友啊? 在QQ中如何知道对方把你删出好友了 QQ会员贺卡发不了 亿赛生活是一个什么样的平台,好吗? QQ幻想世界点图标怎么没有我玩的那个区我玩的是体验区 健身房 私教区 普通会员不能进去锻炼吗 有了QQ会员试用卡可以享受哪些权利? 用户如何在联通手厅领取沃视频一个月体验会员,领取后是否需要兑换激活? FITURE健身镜国贸线下店VIP体验区和普通用户体验区有何不同? 淘宝上出售的{迅雷网游加速器}{迅雷白金会员}1~3天体验帐号是怎么申请的? 200悬赏!! 欢go客户端-星级用户免费体验天翼视讯会员权益活动内容? 会员能享受什么特权? QQ会员免费体验11天在哪找啊 请问9级伤残的定义是什么,什么样的伤残可以评到9级 什么是九级伤残 九级残疾是什么程度 九级伤残严重吗