javascript中的原型和创建对象的原型模式的剖析

来源:互联网 发布:阿里域名备案 编辑:程序博客网 时间:2024/06/07 05:11

原型对象的理解

当创建了一个函数,就会就这个函数创建一个prototype属性,这个属性指向函数的原型对象。

这时,原型对象会获得一个constructor属性,这个属性有一个指针,这个指针指向prototype所在的函数。

当调用构造函数创建一个实例后,这个实例包含一个指针,指针指向函数的原型对象。这个指针叫[[prototype]]

例子:

function Person(){

  }

person.prototype.name="Tom",

person.prototype.age=29,

person.prototype.show=function(){

alert(this.name);

}

var person1==new Person();

person1.show();//Tom

var person2==new Person();

person2.show();//Tom

alert(person1.show()==person2.show());//true

把show()和属性添加到了Person的prototype 属性中,构造函数成了空函数,虽然是空,也可以通过调用构造函数来创建新对象。并且新函数具有相同的属性和方法。新对象的属性和方法是由所有实例共享的。

但是不能通过对象实例重写原型中的值。假设在实例中添加了一个属性,这个属性和原型中一个属性重名,那就在实例中创建该属性,不会影响到原型中的属性。

function Person(){

  }

person.prototype.name="Tom",

person.prototype.age=29,

person.prototype.show=function(){

alert(this.name);

}

var person1==new Person();

var person2==new Person();

person1.name="lily";

alert(person1.show());//lily

alert(person2.show());//Tom

原因:当alert()访问到person1.name时,先在实例上搜索叫name的属性,找到了,就返回该值,找不到就继续向原型搜索了。而person2.name需要搜索到原型才会找到name。

但是使用delete删除了实例属性,可以重新访问原型中的属性。

function Person(){

  }

person.prototype.name="Tom",

person.prototype.age=29,

person.prototype.show=function(){

alert(this.name);

}

var person1==new Person();

var person2==new Person();

person1.name="lily";

alert(person1.show());//lily

alert(person2.show());//Tom

delete person1.name;

alert(person1.show());//Tom

但是原型模式也有自己缺点,他省略了为构造函数传递参数这个环节。结果所有实例默认情况下取得相同的属性值。

最大的问题还是共享引起。如果原型中一个属性包含引用类型值。例如一个数组,当通过一个实例往数组里添加一个元素时,就会影响所有的实例。这就是共享导致的。

function Person(){

  }

person.prototype.name="Tom",

person.prototype.age=29,

person.friend=["wang","du"],

person.prototype.show=function(){

alert(this.name);

}

var person1==new Person();

var person2==new Person();

person1.friend.pudh("liu");

alert(person1.friend);//wang,du,liu

alert(person2.friend);//wang,du,liu

上述为自己理解,哪里不对,还请您给予改正。谢谢。







2 0