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()+'宝宝';
};
返回;
};