首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网站开发 > Web前端 >

prototype中继承的有关问题

2012-11-08 
prototype中继承的问题?最近在学习prototype.js代码,想利用其中的继承来学习一下javascript中的oo思想。碰

prototype中继承的问题?
最近在学习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); //返回falsealert(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 truealert(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 falsealert(c1.param2 == c2.param2);//return true


第三种方法我用一个init方法在每个对象中给param1赋值,这样每个子类能拿到不同的param1对象,但是这样多重继承后设置子类的属性时非常的不方便,请问有什么改进的方法吗?
var c = Class.create(); c.prototype = Object.extend(new b(),{ initialize:function(param){ //this.init(param); } })

你的第二种方法和第三种方法的initialize 都是空函数 参数都是null 当然相等了!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 4 楼 笨笨狗 2008-05-20   1.6版的已经可以在子类方法中调用父类同名方法了,只要你在声明子类方法的时候第一个参数为$super。
谁再说Prototype的继承实现弱,我就跟他急,呵呵…… 5 楼 csf177 2008-05-21   不明白为啥有人喜欢java里面丑陋至极的super
更不明白为啥prototype和moo喜欢在一个面向对象的语言里"实现"面向对象
在一个动态语言里搞静态语言的那一套很好玩?

完全不理解prototype的"类"非要用户把方法定义在一个对象上 然后抄给klass的prototype 6 楼 sp42 2008-05-21   通过复制属性的方法来“继承”,不是严格意义上的继承。
只能说在“基于对象”的思维下简单操作而已。
更传统的OO,正如jianfeng008cn所说,参考ext
我个人推荐yui,因为ext都是从yui学习的,--ext是yui门下的学生啊 7 楼 csf177 2008-05-21   sp42 写道通过复制属性的方法来“继承”,不是严格意义上的继承。
只能说在“基于对象”的思维下简单操作而已。
更传统的OO,正如jianfeng008cn所说,参考ext
我个人推荐yui,因为ext都是从yui学习的,--ext是yui门下的学生啊
拜托老大们不要再说"基于对象"了 JS是面向对象的好不好(反正ECMA262是这么说的)
这么无知的话是谁最先说的啊(应该是某个老外) 不认识动态对象模型就造出一个"基于对象"来煞有介事的解释么?
我找了n久也没找到哪个权威资料这么说
现在真的是流毒甚广 国内的JS书上几乎口径完全一致了 连sp42老大都信了啊
8 楼 basil1292 2008-05-21   jianfeng008cn 写道prototype 的确没有 调用父类的显式引用,但是你的例子说的和你最后提到的解决方法根本不是一回事啊!
按照你的 例子 的确子类实例获得的父类属性值都是一样,但是这个是很符合情理的!!!目前比较理想的集成方案你可以参考extjs2
刚学习prototype.js,自己想写一点东西熟悉一下类库的使用,本以为prototype.js应该能完成如super()这种任务的。

笨笨狗 写道1.6版的已经可以在子类方法中调用父类同名方法了,只要你在声明子类方法的时候第一个参数为$super。
谁再说Prototype的继承实现弱,我就跟他急,呵呵……
看来你是很喜欢prototype啊,可惜我用的还是1.5,跟不上脚步啊!

csf177 写道sp42 写道通过复制属性的方法来“继承”,不是严格意义上的继承。
只能说在“基于对象”的思维下简单操作而已。
更传统的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   值得学习.

热点排行