|
<script type="text/javascript">
/**js继承的实现
ECMAScript 中实现继承的方式不止一种。
这是因为 JavaScript 中的继承机制并不是明确规定的,
而是通过模仿实现的。这意味着所有的继承细节并非由解释程序处理。
*/
/**第一种
对象冒充---构造函数使用 this 关键字给所有属性和方法赋值
(即采用类声明的构造函数方式)。
因为构造函数只是一个函数,所以可使 ClassA 的构造函数成为 ClassB 的方法,
然后调用它。
ClassB 就会收到 ClassA 的构造函数中定义的属性和方法。
*/
function ClassA(sColor){
this.color = sColor;
this.sayColor = function(){
alert(this.color);
}
}
function ClassB(sColor, sName){
this.newMethod = ClassA;//把ClassA赋予一个方法
this.newMethod(sColor);//调用newMethod
delete this.newMethod;//只是删除ClassA的引用newMethod,其的属性和方法已被继承下来了
this.name = sName;
this.sayName = function(){
alert(this.name);
}
}
var b = new ClassB('b','bb');
//call()方法--与对象冒充方法相似,第一个参数用作this的对象。其他参数都直接传递给对象自身
function ClassC(sColor, sName){
ClassA.call(this, sColor);
this.name = sName;
this.sayName = function(){
alert(this.name);
}
}
var c = new ClassC('c', 'cc');
//apply()方法--与call()相似,两个参数,用作this的对象和要传递给参数的数组
function ClassD(sColor, sName){
//ClassA.apply(this, arguments); 这种写法只能是超类中的参数顺序与子类中顺序一致是才能用
ClassA.apply(this, [sColor]);//只能是数组 或者 new Array(sColor)
this.name = sName;
this.sayName = function(){
alert(this.name);
}
}
var d = new ClassD('d', 'dd');
/**
原型链--用另一类型的对象重写类的 prototype 属性。
prototype 对象的任何属性和方法都被传递给那个类的所有实例。
子类的所有属性和方法都必须出现在 prototype 属性被赋值后,
因为在它之前赋值的所有方法都会被删除。
缺点:使用原型链,就无法使用带参构造函数了
*/
function ClassE(){
this.age = '23';
}
ClassE.prototype = new ClassA("e");
ClassE.prototype.name = "ee";
ClassE.prototype.sayName = function(){
alert(this.name);
}
var e = new ClassE();
/**
混合方式--对象冒充继承构造函数的属性,用原型链继承 prototype 对象的方法。
*/
function ClassF(sColor){
ClassA.call(this, sColor);
}
ClassF.prototype.name = 'ff';
ClassF.prototype.sayName = function(){
alert(this.name);
}
var f = new ClassF('f');
</script>
<input value="method" type="button" onclick="javascript:alert(typeof(null))">
<input value="property" type="button" onclick="b.sayName();b.sayColor();alert(b.color)">
<br/>
<hr>
<input value="method" type="button" onclick="alert(typeof(c.sayName));c.sayName();c.sayColor();">
<input value="property" type="button" onclick="alert(c.color);alert(c.name);">
<br/>
<hr>
<input value="method" type="button" onclick="alert(typeof(d.sayName));d.sayName();d.sayColor();">
<input value="property" type="button" onclick="alert(d.color);alert(d.name);">
<br/>
<hr>
<input value="method" type="button" onclick="alert(typeof(e.sayName));e.sayName();e.sayColor();">
<input value="property" type="button" onclick="alert(e.color);alert(e.name);alert(e.age);">
<br/>
<hr>
<input value="method" type="button" onclick="alert(typeof(f.sayName));f.sayName();f.sayColor();">
<input value="property" type="button" onclick="alert(f.color);alert(f.name);">
<br/>
<hr> |
|