当前位置: 首页 > 图文教程 > 网络编程 > Javascript > JS也玩OO继承

Javascript
JS option location 页面跳转实现代码
ExtJS 简介 让你知道extjs是什么
ExtJs 学习笔记 Hello World!
ExtJs 学习笔记基础篇 Ext组件的使用
ExtJs 学习笔记 Ext.Panle Ext.TabPanel Ext.Viewport
漂亮的脚本日历,和大家分享
JS Tween 颜色渐变
js 图片轮播(5张图片)
开发跨浏览器javascript常见注意事项
通用JS事件写法实现代码
Js 订制自己的AlertBox(信息提示框)
js 浮动层菜单收藏
JavaScript入门教程(10) 认识其他对象
JQuery 常用方法基础教程
jQuery 页面载入进度条实现代码
jQuery Ajax 全解析
CSS+Table图文混排中实现文本自适应图片宽度(超简单+跨所有浏览器)
Ext JS Grid在IE6 下宽度的问题解决方法
js window.event对象详尽解析
JavaScript 悬浮窗口实现代码

Javascript 中的 JS也玩OO继承


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-09-12   浏览: 187 ::
收藏到网摘: n/a

算了一下,还是来这里了 ^_^
无忧~~久违了…………贴一个原理的东东吧,
点击运行可以看到效果:
[Ctrl+A 全选 提示:你可先修改部分代码,再按运行]

(stroll的跟贴)

当然,还可以通过以下几种不用“外挂”的方法…… 不过要求使用 Script5.5 才可以使用
比如 call 方法 和 apply方法…… 以下是使用 call 的方法来实现的
apply也差不多,只不过后面调用的参数是数组,详细可以自己参考MSScript5.6说明
Bencalie 还记得以前你跟我说call apply的使用方法么?这回这个答案算圆满了吧?
点击运行可以看到效果:
[Ctrl+A 全选 提示:你可先修改部分代码,再按运行]

(stroll的跟贴)

注意观察所谓“继承对象”的 this.Prototype 这个变量(一开始我没注意看,以为是关键字……害我苦找资料)
this.Prototype = new JSObject(); // 注意:这可不是小写的prototype
this.Prototype.Speak = function(s){.......}
在构造对象后直接反馈 return this.Prototype 其实这个就是 JSPObject 对象,
并不是 JSHuman 对象,所以 var o = new JSHuman();
o 这个实例是无法访问 JSHuman 的成员的
点击运行可以看到效果:
[Ctrl+A 全选 提示:你可先修改部分代码,再按运行]

(bencalie的跟贴)

stroll,看了你的囘答,非常滿意。
你又把問題勾起來了,那麽這裏Base.call(this, v_sName)用成Base.apply(this),我怎麽將v_sName傳遞到Base.BaseName,我反倒對apply的使用有點不好理解了。
最終使用Base.apply(this, [v_sName])用數組傳遞成功
那麽這樣看call和apply僅僅是參數不同了?
(Roman的跟贴)
点击运行可以看到效果:
[Ctrl+A 全选 提示:你可先修改部分代码,再按运行]

(bencalie的跟贴)
擴展了一下,這樣子是不是有簡單的OOP重載功能?
点击运行可以看到效果:
[Ctrl+A 全选 提示:你可先修改部分代码,再按运行]

(stroll的跟贴)

To bencalie ,是的,的确仅仅如此
不过不要认为apply这样是麻烦,其实如果两个对象的构造参数顺序一样的话,可以这么来
Base.apply(this, arguments) 很方便吧?
附上:(因为30秒才一贴~~)
不过你那里添加一个 new Base() 是认为无法继承的做法,其实是可以继承方法的,O.BaseMethod() 的调用就是了 ^_^
to:bencalie(Roman的跟贴)

基对象的方法被overwrite了.为什么stroll说 var o = new JSHuman(); o 这个实例是无法访问 JSHuman 的成员的
請看如下代碼:
点击运行可以看到效果:
[Ctrl+A 全选 提示:你可先修改部分代码,再按运行]

stroll,方法的確繼承過來了,但我在Son對象的搆造函數裏重寫了BaseMethod()
事實上O.BaseMethod()這樣調用已經不是Base對象的BaseMethod()方法了,而是Son對象的BaseMethod()方法,所以我把Base的一個實例儅作Son的成員base,使用
Son實例.base.BaseMethod()
的格式來引用Base的BaseMethod()方法

另外,我喜懽這句:Base.apply(this, arguments)
呵呵……收到~~(stroll的跟贴)

虽然说JS是没有指针了…… 不知道同时构造一个“父对象”,一个“子对象” 再有一个函数传递一个对象参数,这个参数使用父子共有的方法,是不是能够分别调用相应的方法呢? 还未了解JS 的 this 是不是相当于 虚拟地址的指针呢?
所以替换了方法才能解决上面的疑惑(虽然这个迷惑是菜了点,不过符合逻辑:)
还有……如果里面成员有构造对象的函式,是不是也会像c++一样先构造对象,然后再执行其他函式呢? 这个可能或则肯定是按照从上到下了~~~~语言规定?没试过
有没有试过多个父对象的继承呢?不过也不难想到这个一步……(树状继承)
这些就是偶的疑问啦,呵呵……