论坛首页 Web前端技术论坛

javascript 继承实现的一种方式(欢迎讨论,以便改进.优化)

浏览 1297 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2009-12-21   最后修改:2009-12-21
以下,演示了一个js的继承实现,但比竟个人力量有限,请大家共同讨论,是否还有更好的方式来实现.
或者测试是否在其它浏览器存在问题!

<html>
<head><script>
/**
 * 此js文件用于书写继承
 * ---
 * 类:shape
 * 类:Rectangle
 * ---
**/
function Shape()
{	
	if(typeof Shape._init =='undefined')
	{
		//成员函数
		
		Shape.prototype.Draw = function()
		{
			return "draw a shape";
		}
		//
		//  		
		Shape.prototype.ToString = function()
		{
			return "this is a shape";
		}
		
		Shape.prototype.Alert = function()
		{
			alert(this.Draw() + " and " + this.ToString());
		}
		
		//初始化
		Shape._init = true;
	}
}

/**
 * 矩形类
 */

//采用原型的继承必须将此句放在最前面(外面),但这样使的类封装使效.
//下面语句Rectangle.prototype = new Shape()最好放在function Rectangle定义之后,
//个人认为放在此前更易于理解,可理解为申明Rectangle的原型来自于Shape,但部分浏览器可能不能执行此
//代码,目前在IE7,Opera 10.10,Safari 4.0.4 上测试通过,如果您有兴趣,不妨也在此外的浏览器上测试一下,
//如果可以也不妨在文章下说说测试境!

//注意,如果采用Rectangle.prototype = Shape.prototype则两者为同一原型,对其的更改,将直接影响父类.

//网上介绍的call,apply等方法也能实现继承吗?我测试过,但没成功,原因可能是我的写法,我总是习惯将一个js
//类的所有方法体及参数写在一起.

//当然这次也有例外,同样是因为下面这一句,如果您恰有方法来解决这件事,也不妨写了说说!
Rectangle.prototype = new Shape();
function Rectangle()
{
	if(typeof Rectangle._init == 'undefined')
	{		
		Rectangle.prototype.Draw = function()
		{
			return "draw a rectangle";
		}
		//初始化完成
		Rectangle._init = true;
	}
}

/**
 * Main类
*/
function Main()
{
	Main.prototype.main = function()
	{
		var shape = new Shape();
		shape.Alert();
		
		
		var rectangle = new Rectangle();
		alert(rectangle.ToString());//对继承的方法的检查
		alert(rectangle.Draw());//对覆盖的方法的检查
		rectangle.Alert();//对回调方法的检查(测试).		
	}
}
var javascriptMain = new Main();
javascriptMain.main();
</SCRIPT></head>
<body>onload</body>
</html>
论坛首页 Web前端技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics