当前位置: 代码迷 >> Web前端 >> prototype中继承的有关问题
  详细解决方案

prototype中继承的有关问题

热度:208   发布时间:2012-11-08 08:48:11.0
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); //返回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的继承实在有些薄弱..
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  
值得学习.
  相关解决方案