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

js种与继承

2012-11-22 
js类与继承JavaScript 类一、javascript也作为一种面向对象的语言,它也可以有类,有对象,可以用new来创建类

js类与继承

JavaScript 类

一、javascript也作为一种面向对象的语言,它也可以有类,有对象,可以用new来创建类实例,用实例调用它的方法。只是javascript中类形式与java以及其他面向对象语言有所差异而已。

二、类举例

function className()
{
?this.a = 8;
?this.setA = function (parame)
?{
??this.a = parame;
?};
}

function testClass()
{
?var cls = new className();
?document.write(cls.a);
?cls.setA(9);
?document.write(cls.a);
}

================================

深入理解javascript类,参考一下

================================

三、this关键字

this属性表示当前对象,如果在全局作用范围内使用this,则指代当前页面对象window; 如果在函数中使用this,则this指代什么是根据运行时此函数在什么对象上被调用。 我们还可以使用apply和call两个全局方法来改变函数中this的具体指向。

先看一个在全局作用范围内使用this的例子:

?

string 的其余部分解析为十六进制的整数。如果 string 以 0 开头,那么 ECMAScript v3 允许 parseInt() 的一个实现把其后的字符解析为八进制或十六进制的数字。如果 string 以 1 ~ 9 的数字开头,parseInt() 将把它解析为十进制的整数。

②实例说明

parseInt("11"); //返回 11
parseInt("11",10); //返回 11 (10+1)
parseInt("11",2); //返回 3 (2+1)
parseInt("11",8); //返回?9 (8+1)
parseInt("11",16); //返回?17 (16+1)
parseInt("010");???????????????//返回10或8

parseInt("010"); //未定:返回 16 或 8

六、类继承

说到Javascript类继承,就必然离不开原型链,但只通过原型链实现的继承有着不少缺陷。

无参数类继承的问题

先看一段示例代码,实现B继承于A:

?

function?A()?{} ?

A.prototype.a1?=?function()?{}; ?

function?B()?{} ?

B.prototype?=?new?A(); ?

B.prototype.b1?=?function()?{}; ?

var?b?=?new?B(); ?

alert(b.constructor?==?A);?//?true ?

alert(b.constructor?==?B);?//?false??

这段代码的主要问 题是:

1、需要实例化A作为B的原型,此时就执行了A的构造函数。但按照面向对象的规则,实例化B之前,B及其父类A的构造函数都不应该执行。

2、更改了B的prototype,导致b.constructor不是B而是A。

有参类继承的问题

假设A和B都有两个字符串参数s1和s2,A中计算了两段字符串的总长度,B直接以s1、s2为参数调用A:

function?A(s1,?s2)? ?

{ ?

this.totalLength?=?s1.length?+?s2.length; ?

} ?

A.prototype.a1?=?function()? ?

{ ?

}; ?

function?B(s1,?s2)? ?

{ ?

} ?

B.prototype?=?new?A(); ?

B.prototype.b1?=?function()? ?

{ ?

}; ?

new?B(“ab”,?“123″);??

可以看到,这段代码中根本没有办法把s1和s2传到A,而又因为实例化A作为B的原型时没有 参数,所以出现了异常:s1?is?undefined?

?

解决方案

s1 和s2的作用域只在B内,要把它们传到A,就只能在B中操作,借助函数的apply方法就可以实现之:

function?B(s1,?s2)? ?

{ ?

A.apply(this,?arguments); ?

alert(this.totalLength); ?

}

?

?

?

?

?

?

部分出处:http://developer.51cto.com/art/200907/134911.htm

http://developer.51cto.com/art/201105/264432.htm

http://developer.51cto.com/art/200907/134909.htm

?

?

?

热点排行