一直没专门看过js的原型是啥,一直用以往的面向对象的c#语言去使用理解它,今天发现还是稍许不同。
//构造函数声明对象
function Car(name) {
this.name = name;//name属性
this.istrue = function () {//istrue方法
return 'true';
}
}
//使用new操作符来调用构造函数,并返回对象实例。
//实例one
var one = new Car("Lamborghini");
//实例two
var two = new Car("Wuling Sunshine");
//实例three
var three = new Car("Lamborghini");
//对象Car中的istrue方法,必定返回true,可是Car对象实例化形成的对象one和two,这两个的istrue
//方法,虽说返回值都是true,但在对象one和two中istrue方法的本质是不一样的
alert(one.istrue == two.istrue);//false
alert(one == three);//false,即使one和three在实例化时传的参数一样,本质上还是两个对象
alert(one.name == three.name);//true
上面代码中,一个构造函数Car生成了的对象实例间不能共享方法,也就是说,每当你使用new来调用构造函数实例化一个对象时,
都会创建一个istrue方法。这既没有必要,浪费性能资源,因为所有istrue方法的结果都一样,返回true,完全可以在实例化对象之间共享。
所以,Javascript构造函数的缺点就是:同一个构造函数的对象实例之间无法共享方法
若想在对象实例间共享方法,可以把istrue方法添加在Car的原型对象上,如下:
Car.prototype.istrue = function () {
return "true";
}
//再次判断
console.log(one.istrue);
console.log(two.istrue);
console.log(one.istrue==two.istrue);//返回true
3未完待续
网友评论