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
?
?
?