以前我们都是这做的。使用对象字面量创建对象时,逐个地指定其属性:
var car = {
make:"habo",
model:"cow",
year:2019,
color:"blue",
started:false,
start:function(){
this.started = true;
},
stop:function(){
this.started = false;
}
};
对象字面量提供了一个便利方式,让你能够在代码中随时随地创建对象,但需要创建大量对象时,你就会生无可恋了。我们可以通过对象构造函数来解决大量创建对象的问题。
按人们头脑中的约定去创建相同的东西,一般是不可靠的,因为可能出现多一点少一点的情况,总与要求的标准有差距。如果有一个模具,人们只需要放入具体的数值,就可以创建出类似的对象,那该多好。用对象构造函数就可以达到这样的效果。我们先用对象字面量创建一个cat对象,再用构造函数创建它,来对比一下。
使用对象字面量创建:
var cat = {
name:"kitty",
color:"black-white",
weight:5,
bark:function(){
if(this.weight > 5){
alert("It is a fat cat!");
}else{
alert("please feed it more!");
}
}
};
使用构造函数创建:
//先定义一个构造函数
function Cat(name,color,weight){
this.name = name;
this.color = color;
this.weight = weight;
this.bark = function(){
if(this.weight > 5){
alert("It is a fat cat!");
}else{
alert("please feed it more!");
}
};
}
//使用构造函数创建对象
var cat1 = new Cat("Tom","white",5);
cat1.bark();
使用构造函数创建对象,我们就可以创建任何包含name、color、weight属性和具有bark行为的猫了,再也不用担心有小伙伴会创建出不符合标准的“猫”来了。
对象构造函数和函数关系密切。对象构造函数与常规函数看起来没有什么两样。对像构造函数的函数名首字母大写,并非必须这样做。另外,属性名不一定要与形参一样,如:
function Cat(name,color,weight){
this.ming_zi = name;
this.yan_se = color;
this.zhong_liang = weight;
}
使用对象构造函数创建对象时,使用new运算符,如:
//使用构造函数创建对象
var cat1 = new Cat("Tom","white",5);
使用对象构造函数创建对象的过程 |
---|
new首先创建一个新的空对象 |
接下来,new设置this,使其指向这个新对象 |
设置this后,调用函数Cat,并将"Tom",“white”,5作为实参传递给它 |
接下来,执行这个函数的代码。与大多数构造函数一样,Cat给新创建的this对象的属性赋值。 |
最后,Cat函数执行完毕后,运算符new返回this——指向新创建的对象的引用。请注意,它会自动为你返回this,因此无需在代码中显式地返回。指向新对象的引用被返回后,我们将其赋给变量cat1 |
我们还可以使用instanceof运算符,确定对象是由哪个构造函数创建的,如:
var b = cat1 instanceof Cat; //检测cat1是否是由Cat对象构造函数创建的
alert(b);
还可以用delete运算符,删除掉一些属性,如这只猫是不会叫的,删除掉bark属性:
delete cat1.bark;
当然,还可以用对象构造函数创建出来的对象继续添加属性和行为,如:
cat1.age = 11; //向cat1对象添加新属性
alert("cat's age:"+cat1.age);
//向cat1对象添加新行为
cat1.run = function(){
alert("I am running!");
};
cat1.run();
至此,我们明白了对象构造函数的声明与使用。其实,JavaScript也用同样的方法,为我们声明了很多有用的对象构造函数,即内置构造函数,如;
总结一下:
提醒:JavaScript中的函数(我指的是所有函数),并不一定都要赋值,如:
function hello(msg,name,number){
alert(msg+" " +name+" "+number);
}
调用时 hello()、hello(“hi”)、hello(“hi”,“tom”)、hello(“hi”,“tom”,33)等,都是可以的,它并不严格要求你必须传值。
谢谢阅读!