JavaScript——对象构造函数

使用对象字面量创建对象

以前我们都是这做的。使用对象字面量创建对象时,逐个地指定其属性:

 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也用同样的方法,为我们声明了很多有用的对象构造函数,即内置构造函数,如;

  1. var date = new Date(); 日期对象
  2. var array = new Array();数组对象,其实var arr = [];这样声明更方便。
  3. var obj = new Object();创建一个空对象,其实var obj = {};这样创建空对象更方便。
  4. Math实际上是一个用对象字面量创建的对象。所以这可以直接使用,如Math.PI等。

总结一下:

  1. 如果仅仅需要创建少量对象时,适合使用对象字面量,否则应该选择对象构造函数。
  2. 对象构造函数是使用运算符new进行调用的函数。
  3. 对象构造函数可以创建包含相同属性和方法的一致对象。
  4. 使用new调用对象构造函数时,将新建一个空对象,并在构造函数中将其赋给this。
  5. 在构造函数中,可使用this来访问正在创建的对象,进而给它添加属性。
  6. 构造函数自动返回它创建的新对象this。
  7. 与对象字面量一样,可以对用对象构造函数创建的对象进行修改。

提醒:JavaScript中的函数(我指的是所有函数),并不一定都要赋值,如:
function hello(msg,name,number){
alert(msg+" " +name+" "+number);
}
调用时 hello()、hello(“hi”)、hello(“hi”,“tom”)、hello(“hi”,“tom”,33)等,都是可以的,它并不严格要求你必须传值。

谢谢阅读!

你可能感兴趣的:(JavaScript)