最近在学习prototype.js代码,想利用其中的继承来学习一下javascript中的oo思想。碰见到了一些问题,如下
/* * 第一种方法,不使用prototype的继承 * 这是以前在学习继承时使用的继承方法, */ function d(ui){ if(!ui){ return; } this.param1 = document.createElement(ui); } function e(ui){ if(!ui){ return; } this.base = d; this.base(ui); this.param2 = document.createElement(ui); } e.prototype = new d(); function f(ui){ if(!ui){ } this.base = e; this.base(ui); } f.prototype = new e(); var e1 = new e("div"); var e2= new e("div"); var f1 = new f("div"); var f2 = new f("div"); //能够拿到不同的param1对象 alert(e1.param1 ==e2.param1); //返回false alert(f1.param2 == f2.param2);//返回false /* * 第二种方法,使用prototype继承 */ var a = Class.create(); a.prototype = { initialize:function(ui ){ this.param1 = document.createElement(ui); } } var b = Class.create(); b.prototype = Object.extend(new a(),{ initialize:function(ui){ this.param2 = document.createElement(ui); } }) var c = Class.create(); c.prototype = Object.extend(new b(),{ initialize:function(param){ } }) var b1 = new b("div"); var b2= new b("div"); var c1 = new c("div"); var c2 = new c("div"); //这里本意是每一个对象都能拿到自己的一个param1的属性 //但是这里拿到的是同一个引用 alert(b1.param1 == b2.param1);//return true alert(c1.param2 == c2.param2);//return true
我的问题是我想用prototype的方法实现第一种代码的实现,在继承后,子类能拿到自己的在父类中param1对象,但是却发生了第二种代码的情况,这应该是由prototype中继承机制导致的,prototype中继承代码如下:
Object.extend = function(destination, source) { for (var property in source) { destination[property] = source[property]; } return destination; } //继承实现时如: b.prototype = Object.extend(new a(),{}}
我参照ajax.base中形式改进了第二种方法如下:
/* *第三种方法 */ var a = Class.create(); a.prototype = { initialize:function(param){ this.init(param); }, init:function(param){ this.param1 = document.createElement(ui); } } var b = Class.create(); b.prototype = Object.extend(new a(),{ initialize:function(param){ this.init(param); this.param2 = document.createElement(ui); } }) var c = Class.create(); c.prototype = Object.extend(new b(),{ initialize:function(param){ //this.init(param); } }) var b1 = new b("div"); var b2= new b("div"); var c1 = new c("div"); var c2 = new c("div"); alert(b1.param1 == b2.param1);//return false alert(c1.param2 == c2.param2);//return true
第三种方法我用一个init方法在每个对象中给param1赋值,这样每个子类能拿到不同的param1对象,但是这样多重继承后设置子类的属性时非常的不方便,请问有什么改进的方法吗?
1 楼
jianfeng008cn
2008-05-15
var c = Class.create(); c.prototype = Object.extend(new b(),{ initialize:function(param){ //this.init(param); } })
你的第二种方法和第三种方法的initialize 都是空函数 参数都是null 当然相等了!
2 楼
basil1292
2008-05-15
我翻阅了一些文章,在fins的文章主题:我为什么选择mootools,抛弃了prototype. (mootools与prototype 核心代码分析)中很好的说明了这个问题,prototype.js的继承实在有些薄弱..
看那个parent() !!!!
通过moo的Class.extend实现的继承提供一个关键的方法 parent().
使用他你可以调用父类中的同名方法,好像java里的super一样.
这个示例已经可以说明一切了.
var Animal = new Class({ initialize: function(age){ this.age = age; } }); var Cat = Animal.extend({ initialize: function(name, age){ this.parent(age); //will call the previous initialize; this.name = name; } });
看那个parent() !!!!
通过moo的Class.extend实现的继承提供一个关键的方法 parent().
使用他你可以调用父类中的同名方法,好像java里的super一样.
这个示例已经可以说明一切了.
3 楼
jianfeng008cn
2008-05-19
prototype 的确没有 调用父类的显式引用,但是你的例子说的和你最后提到的解决方法根本不是一回事啊!
按照你的 例子 的确子类实例获得的父类属性值都是一样,但是这个是很符合情理的!!!目前比较理想的集成方案你可以参考extjs2
按照你的 例子 的确子类实例获得的父类属性值都是一样,但是这个是很符合情理的!!!目前比较理想的集成方案你可以参考extjs2
4 楼
笨笨狗
2008-05-20
1.6版的已经可以在子类方法中调用父类同名方法了,只要你在声明子类方法的时候第一个参数为$super。
谁再说Prototype的继承实现弱,我就跟他急,呵呵……
谁再说Prototype的继承实现弱,我就跟他急,呵呵……
5 楼
csf177
2008-05-21
不明白为啥有人喜欢java里面丑陋至极的super
更不明白为啥prototype和moo喜欢在一个面向对象的语言里"实现"面向对象
在一个动态语言里搞静态语言的那一套很好玩?
完全不理解prototype的"类"非要用户把方法定义在一个对象上 然后抄给klass的prototype
更不明白为啥prototype和moo喜欢在一个面向对象的语言里"实现"面向对象
在一个动态语言里搞静态语言的那一套很好玩?
完全不理解prototype的"类"非要用户把方法定义在一个对象上 然后抄给klass的prototype
6 楼
sp42
2008-05-21
通过复制属性的方法来“继承”,不是严格意义上的继承。
只能说在“基于对象”的思维下简单操作而已。
更传统的OO,正如jianfeng008cn所说,参考ext
我个人推荐yui,因为ext都是从yui学习的,--ext是yui门下的学生啊
只能说在“基于对象”的思维下简单操作而已。
更传统的OO,正如jianfeng008cn所说,参考ext
我个人推荐yui,因为ext都是从yui学习的,--ext是yui门下的学生啊
7 楼
csf177
2008-05-21
sp42 写道
通过复制属性的方法来“继承”,不是严格意义上的继承。
只能说在“基于对象”的思维下简单操作而已。
更传统的OO,正如jianfeng008cn所说,参考ext
我个人推荐yui,因为ext都是从yui学习的,--ext是yui门下的学生啊
只能说在“基于对象”的思维下简单操作而已。
更传统的OO,正如jianfeng008cn所说,参考ext
我个人推荐yui,因为ext都是从yui学习的,--ext是yui门下的学生啊
拜托老大们不要再说"基于对象"了 JS是面向对象的好不好(反正ECMA262是这么说的)
这么无知的话是谁最先说的啊(应该是某个老外) 不认识动态对象模型就造出一个"基于对象"来煞有介事的解释么?
我找了n久也没找到哪个权威资料这么说
现在真的是流毒甚广 国内的JS书上几乎口径完全一致了 连sp42老大都信了啊
8 楼
basil1292
2008-05-21
jianfeng008cn 写道
prototype 的确没有 调用父类的显式引用,但是你的例子说的和你最后提到的解决方法根本不是一回事啊!
按照你的 例子 的确子类实例获得的父类属性值都是一样,但是这个是很符合情理的!!!目前比较理想的集成方案你可以参考extjs2
按照你的 例子 的确子类实例获得的父类属性值都是一样,但是这个是很符合情理的!!!目前比较理想的集成方案你可以参考extjs2
刚学习prototype.js,自己想写一点东西熟悉一下类库的使用,本以为prototype.js应该能完成如super()这种任务的。
笨笨狗 写道
1.6版的已经可以在子类方法中调用父类同名方法了,只要你在声明子类方法的时候第一个参数为$super。
谁再说Prototype的继承实现弱,我就跟他急,呵呵……
谁再说Prototype的继承实现弱,我就跟他急,呵呵……
看来你是很喜欢prototype啊,可惜我用的还是1.5,跟不上脚步啊!
csf177 写道
sp42 写道
通过复制属性的方法来“继承”,不是严格意义上的继承。
只能说在“基于对象”的思维下简单操作而已。
更传统的OO,正如jianfeng008cn所说,参考ext
我个人推荐yui,因为ext都是从yui学习的,--ext是yui门下的学生啊
只能说在“基于对象”的思维下简单操作而已。
更传统的OO,正如jianfeng008cn所说,参考ext
我个人推荐yui,因为ext都是从yui学习的,--ext是yui门下的学生啊
拜托老大们不要再说"基于对象"了 JS是面向对象的好不好(反正ECMA262是这么说的)
这么无知的话是谁最先说的啊(应该是某个老外) 不认识动态对象模型就造出一个"基于对象"来煞有介事的解释么?
我找了n久也没找到哪个权威资料这么说
现在真的是流毒甚广 国内的JS书上几乎口径完全一致了 连sp42老大都信了啊
那js到底是基于对象还是面向对象的呢?
9 楼
csf177
2008-05-21
basil1292 写道
那js到底是基于对象还是面向对象的呢?
JS自己的语言标准说的很清楚是面向对象 就在正文第一页(PDF第13页) 原文是这样写的
ECMAScript is an object-oriented programming language for performing computations and manipulating computational objects within a host environment.
基于对象这个词我就没有查到是什么意思,也不清楚用它来形容JS是什么意思。"JS是基于对象的,而非面向对象的"这个说法我没有在任何权威资料中发现(当然如果发现就太奇怪了,有什么资料会直接否定语言的标准文档呢)。
10 楼
woweiwokuang
2008-05-25
值得学习.