javascript入门教程(二):对象和函数

阅读这篇文章需要其他语言的编程经验。

Javascript中的简单类型包括:

1。数

2。一串

三.布尔(真与假)

4.null

5.undefined

其他类型的对象(我们不是通过typeof运算符的返回值混淆),例如:

1。功能

2。阵列

三.正则表达式

4。对象(对象是自然对象)

对象库

在Javascript中,对象是属性的集合(对象是关联数组),每一个都包含:

1。属性名,必须是字符串

2。属性值,可以是未定义的任何值。

用对象文字创建对象:

复制代码代码如下所示:

用对象文字{ }创建一个空对象

无功empty_object = { };



对象的属性名和属性值:

复制代码代码如下所示:

VaR的走狗= { {

name属性名称杰罗姆属性值

名杰罗姆

name属性名称霍华德属性值

姓:霍华德

};



如果属性名是合法标识符,则可以省略引号:

复制代码代码如下所示:

var飞行= {

航空公司:海洋

编号:815,

出发:{

国际航空运输协会:你

时间: 2004-09-22 14:55

城市:悉尼

},

到达:{

国际航空运输协会

时间:2004-09-23 10:42

城市:洛杉矶

}

};



让我们来看一下属性访问的示例。

复制代码代码如下所示:

VaR的主人= {姓名:name5566};



owner.name; / / name5566

老板{名字}; / / name5566



owner.job; / /未定义

owner.job =编码器; / /或业主{工作} =编码器;



如果属性名不是合法标识符,则需要用引号包装。不存在的属性值是未定义的。对象是通过引用传递的,而不是通过值传递的:

复制代码代码如下所示:

变量x { };

var所有者x;

owner.name =name5566 ;

结构; / / x.name = = =name5566



这里x和所有者引用相同的对象。

对象的属性可以通过删除操作符删除:

复制代码代码如下所示:

删除对象X; / / X属性删除对象



对象的原型(原型)

每个对象与一个原型对象(原型对象),和对象可以从原型对象继承属性。我们创建的文字对象的对象,其原型对象是object.prototype对象(对象本身的object.prototype没有原型对象)。当我们创建的对象,我们可以设置对象的原型对象(然后讨论具体的设置方法),试图让(而不是修改)对象的一个属性,如果对象不存在此属性,然后将尝试从Javascript对象的原型对象获取此属性,如果属性不是原型对象,然后从搜索,在原型对象的原型对象等等,直到object.prototype原型对象:当我们修改一个对象的属性时,我们不影响原型对象与获取属性相比。

函数库

在Javascript中,函数也是对象,这是联系在一起的function.prototype原型对象(function.prototype链接对象。原型)。函数有一个名为原型,它的类型是对象,对象有属性的构造函数,和构造函数的值的函数:

复制代码代码如下所示:

Var(f =函数){ }



类型f.prototype; / / 'object

类型f.prototype.constructor; / / 'function



F = f.prototype.constructor; / /真的



函数是一个对象。可以使用类似对象的函数。也就是说,函数可以存储在变量和数组中,并可以作为参数传递给函数。函数可以在函数内部定义:

1的语境。功能

2法典。功能

函数创建如下:

复制代码代码如下所示:

函数添加(a,b){

返回A+;

}



console.log(F); / / { }输出功能:添加



关键字函数之后的函数名是可选的,我们将函数名用于几个目的:

1。递归调用

2。用于通过调试器、开发工具等来标识函数。

很多时候我们不需要一个函数的名字,而没有函数名功能称为一个匿名函数。括号封装是一个parameters.javascript不需要真正的辩论和参数匹配,例如:

复制代码代码如下所示:

函数(a,b){

返回A+;

}



添加(1, 2, 3);参数和参数不匹配



如果参数太多,多余的参数会被忽略,如果参数太少,对未指定参数的值是未定义的。函数必须有返回值,如果返回值不是由return语句中指定,函数返回的值是未定义的。

一个函数及其访问的外部变量构成一个闭包,这是Javascript的关键魅力所在。

函数调用

当调用每个函数时,接收两个附加参数:

1.this

2.arguments

这个值与特定调用的模式有关,Javascript中有四种调用模式:

1。方法调用模式。如果一个对象的属性是一个函数,它被称为一个方法。如果一个方法被称为O. M(args),这是一个客体(可见这和O绑定绑定调用时),例如:

复制代码代码如下所示:

var obj = { {

值:0,

增量:函数(v){

this.value(typeof = V = = = 'number'v:1);

}

};

obj.increment(本); / / = = = obj



2。函数调用模式。如果一个函数不是一个对象的属性,那么当函数绑定到全局对象时,它将被调用为一个函数,例如:

复制代码代码如下所示:

消息=你好世界;

函数(){()

console.log(这个消息);

}



P('Hello World); / /输出



这种行为有时令人费解:

复制代码代码如下所示:

obj = { {

值:0,

增量:函数(){

var函数(){()

值1中的全局对象

this.value = 1;

}



调用函数的助手。

因此,这是一个全局对象

助手();

}

};



obj.increment(obj值); / / = 0



我们期望的结果应该是:

复制代码代码如下所示:

obj = { {

值:0,

增量:函数(){

var =;

var函数(){()

that.value = 1;

}



助手();

}

};



obj.increment(obj值); / / = 1



三.构造函数调用模式。用于使用新前缀的函数称为构造函数,例如:

复制代码代码如下所示:

测试被称为构造函数。

var测试=函数(字符串){

this.message =字符串;

}



VaR中=新的测试(Hello World);



一个函数可以用它前面的新函数调用(这样的函数通常是大写的)。添加新对象后,将创建一个与此函数链接的原型属性对象,构造函数中的这个对象是一个对象。

4.apply调用模式,应用一个函数来调用一个函数,它有两个参数,第一个是这样的,第二是参数数组,例如:

复制代码代码如下所示:

函数(a,b){

返回A+;

}



VaR RET = add.apply(null,{ 3, 4 }); / / ret = 7



当函数调用时,我们可以访问一个名为参数的类数组(一个非真实Javascript数组),它包含所有参数,这样我们就可以实现变长参数。

复制代码代码如下所示:

var =函数(){()

var总和= 0;

对于(var i = 0;i < arguments.length;+ +我){

总和=参数{ };

}

收起回复;

}



添加(1, 2, 3,4);



反常的

现在我们来讨论Javascript的异常处理机制,我们使用抛出语句抛出异常,尝试缓存语句捕获和处理异常:

复制代码代码如下所示:

函数(a,b){

如果a'number'typeof(类型B | |!= =!= =数){

/异常

把{

名称:'typeerror,

消息:'add需要数

};

}

返回A+;

}



捕获和异常处理

{试

添加(七);

抛出的异常对象

} catch(e){

console.log(查询+ ':' + e.message);

}



为Javascript类型添加属性

Javascript中的大多数类型都存在构造函数:

1的构造函数。对象的对象

2的构造函数。数组是数组

3的构造函数。函数功能

4的构造函数。字符串的字符串

5的构造函数。数是数

6。布尔构造函数是布尔型的

7的构造函数。正则表达式正则表达式

我们可以将属性添加到构造函数的原型(通常是添加方法),以便该属性可用于相关变量:

复制代码代码如下所示:

number.prototype.integer =函数(){

返回数学{ < 0'ceil:'floor}(本);

}



(1.1)整数(1);



行动范围

Javascript需要通过函数构建它的作用域:

复制代码代码如下所示:

函数(){



(});



这里创建并执行一个匿名函数。不希望通过作用域暴露的变量可以隐藏。

复制代码代码如下所示:

var obj =函数(){()

隐藏值,外部访问

var值= 0;



返回{

此方法可以修改值

增量:函数(){

值= 1;

},

此方法只能读取值

GetValue:函数(){

返回值;

}

};

(});



obj.increment();

(obj.getvalue = 1);



继承

Javascript继承的方法很多。

创建对象时,我们可以设置与对象相关联的原型对象,我们这样做:

复制代码代码如下所示:

创建一个O对象,原型对象{:1,y,2 }

var o = object.create(x 1,y::{ 2 });



该方法是object.create ECMAscript 5中定义的,如果你使用ECMAscript 3,你可以实现一个自己创造的方法:

复制代码代码如下所示:

/ /如果object.create方法没有定义

如果(typeof object.create!= 'function){

/ /创建object.create方法

object.create =功能(o){

Var(f =函数){ };

f.prototype = O;

创建一个新对象,这个对象是原型对象O

返回新的f();

};

}



通过object.create方法,我们开展了基于原型的继承:一个新的对象直接继承了一个旧的对象的属性(相对于基于类的继承是不需要类的存在,对象直接继承的对象实例uff1a)。

复制代码代码如下所示:

无功mymammal = { {

名称:'herb哺乳动物,

get_name:函数(){

返回this.name;

},

表示:函数(){

返回this.saying | |;

}

};



/ / mymammal继承

我的猫= object.create VaR(mymammal);

mycat.name = 'henrietta;

mycat.saying = 'meow;

mycat.purr =功能(N){

变量i;

对于(i = 0;i <;n;i = 1){

如果({){

+;

}

S = R;

}

返回的;

};

mycat.get_name =函数(){

返回this.says()+ + + + + this.name this.says();

};



上面的代码很简单,但不能保护私有成员。我们可以使用模块模式。在模块模式中,一类对象由函数生成,并使用函数作用域保护私有成员不被外部访问:

复制代码代码如下所示:

哺乳动物的功能,用于建造哺乳动物。

var哺乳动物=函数(规范){

对于已构建的对象

var = { };



get_name / /公共方法可以被外部访问

that.get_name =函数(){

/ / spec.name不能直接访问外部

返回spec.name;

};



表示公共方法可以是外部访问。

that.says =函数(){

/ / spec.saying不能直接访问外部

返回spec.saying | |;

};



返回;

};



创建哺乳动物对象

无功mymammal =哺乳动物({姓名:'herb});



猫函数,用于构造猫

var =函数(规范){

spec.saying = spec.saying'meow| |;



猫是从哺乳动物遗传来的,所以要建造哺乳动物的物体。

=哺乳动物(规范);



/ /添加公共方法的咕噜声

that.purr =功能(N){

变量i;

对于(i = 0;i <;n;i = 1){

如果({){

+;

}

S = R;

}

返回的;

};



修改get_name / /公共方法

that.get_name =函数(){

返回that.says()++ spec.name +

+ that.says();

返回;

};

};



创建猫对象

VaR MYCAT =猫({姓名:'henrietta});



在模块模式中,继承是通过调用构造函数实现的,此外,我们还可以访问子类中父类的方法:

复制代码代码如下所示:

Object.prototype.superior =函数(名){

var =这个,方法= { };

返回函数(){

返回method.apply(,参数);

};

};



VaR COOLCAT =功能(SPEC){

/ / get_name方法获取子类

var =猫(SPEC),super_get_name = that.superior('get_name);

that.get_name =功能(N){

return'like + super_get_name()+'宝宝';

};

返回;

};