Javascript学习笔记(一)

看了JavaScript高级程序设计的第四章继承,自己想总结一下。
继承的方式:1.对象冒充,2.call()方法,3.apply()方法,4.原型链.5.混合方法
这里我主要是说下call(),原型链和混合方法
Call()方法是与对象冒充方法最相试的方法,它的第一个参数是this的对象,其他的参数都是直接传递给函数本身
例子:

Code
function sayColor(sPrefix,sSuffix)
{
    alert(sPrefix+this.color+sSuffix);
}
var obj = new Object();
obj.color ="red";
sayColor.call(obj,"The color is","a very nice coor indeed.");
//output "The color is red a very nice coor indeed"

从上面的代码看出,sayColor方法可以被任何对象调用。但是有多个方法那我不是每个都要写call()这样太不方便了,阅读性也不好。call()方法和apply()用法差不多就不多说了

原型链方法
大家记得prototype属性吗?作用:返回对象类型原型的引用.原型链利用这种功能来实现继承机制的
先看看例子:


Code
function ClassA(){}
ClassA.prototype.color = "red";
ClassA.prototype.sayColor = function()
{
    alert(this.color);
}
function ClassB(){}
ClassB.prototype = new ClassA();

从上面的代码看出。把ClassB的prototype属性设置成ClassA的实例。这很有意义,因为想要ClassA的所有属性和方法,但又不想逐个将他们赋予ClassB的prototype属性,解决了上面方法的不便。的确是个好方法。但是原型链方法不能传递参数,想改变属性的值要对象创建后才能赋值。如果要创建多个对象那我还要一个个的改变他们的非函数属性值。

看看混合方法。混合方法就是用对象冒充继承构造函数的属性,用原型链继承prototype对象的方法。

Code
function ClassA(sColor)
{
   this.color = sColor;
}
ClassA.prototype.sayColor = function()
{
    alert(this.sColor);
}
function ClassB(sColor,sName)
{
    ClassA.call(this,sColor);
    this.name = sName;
}
ClassB.prototype = new ClassA();
ClassB.prototype.sayName = function()
{
    alert(this.name);
}

var objA = new ClassA("red");
var objB = new ClassB("blue","Nicholas");
objA.sayColor();//outputs "red"
objB.sayColor();//outputs "blue"
objB.sayName();//outputs "Nicholas"
此例子可以解决上面两个方法的问题。用call()方法来继承构造函数的非函数属性可以传递参数,初始化了创建对象的所需要的属性,更加符合面向对象。用原型链方法继续函数属性,方便快捷解决继承方法的不便。

 

Code
function sayColor(sPrefix,sSuffix)
{
    alert(sPrefix+this.color+sSuffix);
}
var obj = new Object();
obj.color ="red";
sayColor.call(obj,"The color is","a very nice coor indeed.");
//output "The color is red a very nice coor indeed"
从上面的代码看出,sayColor方法可以被任何对象调用。但是有多个方法那我不是每个都要写call()这样太不方便了,阅读性也不好。call()方法和apply()用法差不多就不多说了

原型链方法
大家记得prototype属性吗?作用:返回对象类型原型的引用.原型链利用这种功能来实现继承机制的
先看看例子:


Code
function ClassA(){}
ClassA.prototype.color = "red";
ClassA.prototype.sayColor = function()
{
    alert(this.color);
}
function ClassB(){}
ClassB.prototype = new ClassA();

从上面的代码看出。把ClassB的prototype属性设置成ClassA的实例。这很有意义,因为想要ClassA的所有属性和方法,但又不想逐个将他们赋予ClassB的prototype属性,解决了上面方法的不便。的确是个好方法。但是原型链方法不能传递参数,想改变属性的值要对象创建后才能赋值。如果要创建多个对象那我还要一个个的改变他们的非函数属性值。

看看混合方法。混合方法就是用对象冒充继承构造函数的属性,用原型链继承prototype对象的方法。

Code
function ClassA(sColor)
{
   this.color = sColor;
}
ClassA.prototype.sayColor = function()
{
    alert(this.sColor);
}
function ClassB(sColor,sName)
{
    ClassA.call(this,sColor);
    this.name = sName;
}
ClassB.prototype = new ClassA();
ClassB.prototype.sayName = function()
{
    alert(this.name);
}

var objA = new ClassA("red");
var objB = new ClassB("blue","Nicholas");
objA.sayColor();//outputs "red"
objB.sayColor();//outputs "blue"
objB.sayName();//outputs "Nicholas"
此例子可以解决上面两个方法的问题。用call()方法来继承构造函数的非函数属性可以传递参数,初始化了创建对象的所需要的属性,更加符合面向对象。用原型链方法继续函数属性,方便快捷解决继承方法的不便。

 

 


Code
function ClassA(){}
ClassA.prototype.color = "red";
ClassA.prototype.sayColor = function()
{
    alert(this.color);
}
function ClassB(){}
ClassB.prototype = new ClassA();

从上面的代码看出。把ClassB的prototype属性设置成ClassA的实例。这很有意义,因为想要ClassA的所有属性和方法,但又不想逐个将他们赋予ClassB的prototype属性,解决了上面方法的不便。的确是个好方法。但是原型链方法不能传递参数,想改变属性的值要对象创建后才能赋值。如果要创建多个对象那我还要一个个的改变他们的非函数属性值。

看看混合方法。混合方法就是用对象冒充继承构造函数的属性,用原型链继承prototype对象的方法。

Code
function ClassA(sColor)
{
   this.color = sColor;
}
ClassA.prototype.sayColor = function()
{
    alert(this.sColor);
}
function ClassB(sColor,sName)
{
    ClassA.call(this,sColor);
    this.name = sName;
}
ClassB.prototype = new ClassA();
ClassB.prototype.sayName = function()
{
    alert(this.name);
}

var objA = new ClassA("red");
var objB = new ClassB("blue","Nicholas");
objA.sayColor();//outputs "red"
objB.sayColor();//outputs "blue"
objB.sayName();//outputs "Nicholas"
此例子可以解决上面两个方法的问题。用call()方法来继承构造函数的非函数属性可以传递参数,初始化了创建对象的所需要的属性,更加符合面向对象。用原型链方法继续函数属性,方便快捷解决继承方法的不便。

 


 

posted @ 2008-11-15 16:17  啊文  阅读(219)  评论(0编辑  收藏  举报