1.JavaScript构造函数和其它函数的唯一区别: 构造函数是通过new操作符来调用的。也就是说如果构造函数不用new操作符来调用,那它就是普通函数,反过来说任何函数通过new操作符来调用就可以当做构造函数。
function Car(name,color,speed,type){
this.name=name;
this.color=color;
this.speed=speed;
this.type=type;
}
//通过new来调用
var car1=new Car('xixi','red',2,'a');
console.log(car1.name); //xixi
//没用new来调用
var car2=Car('haha','green',3,'b');
console.log(car2.name); //报错
console.log(window.name); // haha
2. 接下看一个通过利用prototype来定义类的例子。
function Drivers(){
var names="";
this.addDriver= function(name){
names = names +" " + name;
}
this.toString = function(){
return names;
}
}
function Car(){
}
Car.prototype.color = "red";
Car.prototype.model = "BMW";
//Car.prototype.drivers = ['Mike','Kevin'];
Car.prototype.drivers =new Drivers();
Car.prototype.blar = function(){
alert("I am a car: " + this.model + " in " + this.color + ". " + this.drivers + " can drive me" );
};
var car1 = new Car();
car1.color='Blue';
//car1.drivers.push('Luios');
car1.drivers.addDriver('Mike');
car1.drivers.addDriver('Kevin');
car1.drivers.addDriver('Luios');
car1.blar();//outputs I am a car: BMW in Blue. Mike,Kevin,Luios can drive me
var car2 = new Car();
car2.blar(); //outputs I am a car: BMW in red. Mike,Kevin,Luios can drive me
3.如果想让添加的属性或者方法能够被实例使用,要使用prototype添加,下面的例子说明了这一点
function sayHi() {
alert("hi");
}
sayHi.sayHello = function() {
alert("hello");
};
sayHi.sayHello();//outputs hello
var osayHi = new sayHi();//outputs hi
osayHi.sayHello(); // TypeError: osayHi.sayHello is not a function
因为不是通过在prototype中以这样的方式添加的(sayHi.prototype.sayHello),实例是不能访问sayHello方法的,只能通过sayHi.sayHello(类似如静态方法)的方式访问。同样如果添加的时候是通过prototype方式,则不能用静态方式访问。
JavaScript构造函数和其它函数的唯一区别: 构造函数是通过new操作符来调用的。也就是说如果构造函数不用new操作符来调用,那它就是普通函数,反过来说任何函数通过new操作符来调用就可以当做构造函数。