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
上述为自己理解,哪里不对,还请您给予改正。谢谢。
- javascript中的原型和创建对象的原型模式的剖析
- JavaScript原型、原型链、对象的创建
- 原型模式和基于原型继承的JavaScript对象系统
- JavaScript 创建对象---原型模式
- 【JS】JavaScript中对象的创建与原型模式
- Javascript中对象的原型和对象的原型对象
- JavaScript--创建对象和生成原型链的方法
- javascript对象的创建方式,原型,方法
- 对象的创建>原型
- JavaScript的原型对象
- javascript中的 对象 和 原型
- Javascript中的对象和原型
- JavaScript的原型模式
- 三张图搞懂JavaScript的原型对象和原型链
- 基于原型的对象创建和继承
- 原型管理器--对象的克隆--原型模式
- Javascript的原型对象和prototype属性
- Javascript对象和原型继承的理解
- Zeppelin 的安装及简单使用
- c++基本数据类型
- 设计模式—浅析三种工厂模式的特点
- android中使用VideoView播放视频
- Genymotion下载虚拟设备超时的问题
- javascript中的原型和创建对象的原型模式的剖析
- Python中的垃圾回收机制
- 用maven重构ssh项目遇到的问题
- 对比Amazon Echo,Google Home为何只采用了2个麦克风?
- MongoDB 3.X 用户权限控制
- overload与返回类型的关系
- 学生分组的小程序
- MySQL索引优化
- windows下同时启动多个tomcat