【转】js中的原型
原文链接:https://blog.csdn.net/u012468376/article/details/53121081
一、什么是原型
原型是Javascript中的继承的基础,JavaScript的继承就是基于原型的继承。
1.1 函数的原型对象
在JavaScript中,我们创建一个函数A(就是声明一个函数), 那么浏览器就会在内存中创建一个对象B,而且每个函数都默认会有一个属性 prototype 指向了这个对象( 即:prototype的属性的值是这个对象 )。这个对象B就是函数A的原型对象,简称函数的原型。这个原型对象B 默认会有一个属性 constructor 指向了这个函数A ( 意思就是说:constructor属性的值是函数A )。
1.2 使用构造函数创建对象
当把一个函数作为构造函数 (理论上任何函数都可以作为构造函数) 使用new创建对象的时候,那么这个对象就会存在一个默认的不可见的属性,来指向了构造函数的原型对象。 这个不可见的属性我们一般用 [[prototype]] 来表示,只是这个属性没有办法直接访问到。
看下面的代码:
1、从上面的图示中可以看到,创建p1对象虽然使用的是Person构造函数,但是对象创建出来之后,这个p1对象其实已经与Person构造函数没有任何关系了,p1对象的[[ prototype ]]属性指向的是Person构造函数的原型对象。
2、 如果使用new Person()创建多个对象,则多个对象都会同时指向Person构造函数的原型对象。
3、 我们可以手动给这个原型对象添加属性和方法,那么p1,p2,p3…这些对象就会共享这些在原型中添加的属性和方法。
4、 如果我们访问p1中的一个属性name,如果在p1对象中找到,则直接返回。如果p1对象中没有找到,则直接去p1对象的[[prototype]]属性指向的原型对象中查找,如果查找到 则返回。(如果原型中也没有找到,则继续向上找原型的原型—原型链。 后面再讲)。
5、 如果通过p1对象添加了一个属性name,则p1对象来说就屏蔽了原型中的属性name。 换句话说:在p1中就没有办法访问到原型的属性name了。
6、 通过p1对象只能读取原型中的属性name的值,而不能修改原型中的属性name的值。 p1.name = “李四”; 并不是修改了原型中的值,而是在p1对象中给添加了一个属性name。
二、与原型有关的几个属性和方法
2.1 prototype属性
prototype 存在于构造函数中 (其实任意函数中都有,只是不是构造函数的时候prototype我们不关注而已) ,他指向了这个构造函数的原型对象。
参考前面的示意图。
2.2 constructor属性
constructor属性存在于原型对象中,他指向了构造函数
看下面的代码:
四、动态原型模式创建对象
说明:
- 组合模式和动态原型模式是JavaScript中使用比较多的两种创建对象的方式。
- 建议以后使用动态原型模式。他解决了组合模式的封装不彻底的缺点。
最新文章
- TCP同步与异步,长连接与短连接【转载】
- 文件夹锁定(Source)
- ConCurrent in Practice小记 (1)
- Ladda – 把加载提示效果集成到按钮中,提升用户体验
- MySql练习+加源代码
- PHP版本区别
- Timer与ScheduledThreadPoolExecutor的比较
- SpringMvc中Interceptor拦截器用法
- js/ajax跨越访问-jsonp的原理和实例(javascript和jquery实现代码)
- uboot在s3c2440上的移植(2)
- Java 文件下载
- 泛型Binary Search Tree实现,And和STL map比较的经营业绩
- 基于类(Java)和基于原理(JavaScript)的对象系统的比较
- sed武功心法(info sed翻译+注解)
- 二阶环路滤波器的matlab 设计
- python(一)——初识与变量
- 面试题---实现strcpy函数
- repr方法字符串输出实例对象的值
- vue 之 Vue.extend()
- node集成mysql——pool连接池