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

原型对象的理解

当创建了一个函数,就会就这个函数创建一个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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值