JavaScript面向对象程序设计三 原型模式(上)


Posted in Javascript onDecember 21, 2011

我们创建的每一个函数都有一个prototype(原型)属性,该属性是一个对象,包含可以有特定类型的所有实例共享的属性和方法。使用它的好处就在于可以让所有对象实例共享它所包含的属性和方法,也就是说,不必在构造函数中定义对象的信息,而是可以将这些信息,直接添加在原型对象中,如下所示,还是接着改写前两篇日志中的例子:

function Employee() { 
}; 
Employee.prototype.Name = "Jim"; 
Employee.prototype.Age = 28; 
Employee.prototype.Job = "SoftWare Engineer"; 
Employee.prototype.SayName = function () { 
alert(this.Name); 
}; 
var employee1 = new Employee(); 
employee1.SayName();//Jim 
var emplayee2 = new Employee(); 
emplayee2.SayName(); //Jim 
alert(employee1.SayName = emplayee2.SayName);//true

与构造函数模式不同的是,新对象的这些属性和方法是由所有实例共享的。
以上即是原型模式的一个引子,要理解原型模式的工作原理,就需要了解ECMASCRIPT中原型的性质。
理解原型
在Javascript中,只要创建了一个新函数,就会根据一组特定的规则为该函数创建一个prototype属性。在默认的情况下,虽有prototype属性都会自动获得一个constructor属性,这个属性包含一个指向prototype属性所在函数的指针,而通过这个构造函数,我们还可以继续为原型添加其他属性和方法。
创建了自定义的构造函数之后,其原型属性默认只会取得constructor属性,而至于其他的方法,则都是从Object继承来的。当调用构造函数创建一个新实例后,该实例的内部将包含一个指针(内部属性),指向构造函数的原型属性。要注意的是这个连接存在于实例和构造函数原型属性之间,而不是存在于实例与构造函数之间。
在某些实现中,无法访问到内部属性(_proto_属性),但是在所有实现中都可以通过isPrototypeOf方法来确定对象之间是否存在这种原型关系。从本质上来看,如果对象的_proto_属性指向isPrototypeOf,这个方法就返回true。如下所示:
alert(Employee.prototype.isPrototypeOf(employee1)); //true 
alert(Employee.prototype.isPrototypeOf(employee2));//true

每当代码读取某个对象的某个属性时,都会执行搜索,目标是具有给定名字的属性。搜索最先从对象实例本身开始。如果在实例中找到具有给定名字的属性,则然后该属性的值,如果没有找到,则继续搜索指针指向的原型对象,在原型对象中查找具有给定名字的属性。如果在原型对象中找到这个属性,则返回该属性的值。这也正是对个对象实例共享原型所保存的属性和方法的基本原理。
前面说过,原型最初只包含constructor属性,而该属性也是共享的,因此可以通过对象实例访问
虽然可以通过对象实例访问保存在原型中的值,但是不能通过对象实例重写原型中的值,如果我们在实例中添加一个属性,而该属性与实例原型中的一个属性名称相同,name在实例中创建的属性会屏蔽(.net成为隐藏)原型中的那个属性,如下所示:
function Employee() { 
}; 
Employee.prototype.Name = "Jim"; 
Employee.prototype.Age = 28; 
Employee.prototype.Job = "SoftWare Engineer"; 
Employee.prototype.SayName = function () { 
alert(this.Name); 
}; 
emplayee2.Name = "Sun"; 
alert(employee1.Name); //Jim 
alert(employee2.Name);//Sun

其中employee1.Name的Jim来自原型,二employee2.Name的sun来自实例。
Javascript 相关文章推荐
超清晰的document对象详解
Feb 27 Javascript
来自chinaz的ajax获取评论代码
May 03 Javascript
jQuery解决下拉框select设宽度时IE 6/7/8下option超出显示不全
May 27 Javascript
使用javascript做的一个随机点名程序
Feb 13 Javascript
手机号码,密码正则验证
Sep 04 Javascript
Bootstrap中CSS的使用方法
Feb 17 Javascript
实例讲解JavaScript中的this指向错误解决方法
Jun 13 Javascript
详解Node 定时器
Feb 26 Javascript
巧妙运用v-model实现父子组件传值的方法示例
Apr 07 Javascript
详解Nuxt.js中使用Element-UI填坑
Sep 06 Javascript
JavaScript实现省份城市的三级联动
Feb 11 Javascript
js前端传json后台接收‘‘被转为quot的问题解决
Nov 12 Javascript
jquery $.getJSON()跨域请求
Dec 21 #Javascript
jquery事件机制扩展插件 jquery鼠标右键事件
Dec 21 #Javascript
DIV外区域Click后关闭DIV的实现代码
Dec 21 #Javascript
用JSON做数据传输格式中的一些问题总结
Dec 21 #Javascript
40款非常有用的 jQuery 插件推荐(系列一)
Dec 21 #Javascript
这段js代码得节约你多少时间
Dec 20 #Javascript
js实现的仿新浪微博完美的时间组件升级版
Dec 20 #Javascript
You might like
跟我学Laravel之配置Laravel
2014/10/15 PHP
laravel创建类似ThinPHP中functions.php的全局函数
2016/11/26 PHP
PHP使用redis消息队列发布微博的方法示例
2017/06/22 PHP
Ubuntu 11.10 安装Node.js的方法
2011/11/30 Javascript
jquery动画3.创建一个带遮罩效果的图片走廊
2012/08/24 Javascript
js 实现数值的千分位及保存小数方法(推荐)
2016/08/01 Javascript
bootstrap按钮插件(Button)使用方法解析
2017/01/13 Javascript
webpack入门+react环境配置
2017/02/08 Javascript
javascript设计模式之中介者模式学习笔记
2017/02/15 Javascript
js构造函数创建对象是否加new问题
2018/01/22 Javascript
Javascript的console['']常用输入方法汇总
2018/04/26 Javascript
Nodejs模块的调用操作实例分析
2018/12/25 NodeJs
Nodejs处理异常操作示例
2018/12/25 NodeJs
如何在vue中使用jointjs过程解析
2020/05/29 Javascript
vue数据更新UI不刷新显示的解决办法
2020/08/06 Javascript
vue3自定义dialog、modal组件的方法
2021/01/04 Vue.js
[20:46]Ti4循环赛第三日VG vs DK
2014/07/12 DOTA
[01:06:12]VP vs NIP 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/17 DOTA
python利用不到一百行代码实现一个小siri
2017/03/02 Python
python中requests和https使用简单示例
2018/01/18 Python
python构建基础的爬虫教学
2018/12/23 Python
Python实现二叉树前序、中序、后序及层次遍历示例代码
2019/05/18 Python
python3实现mysql导出excel的方法
2019/07/31 Python
Python 实现try重新执行
2019/12/21 Python
Python3开发环境搭建详细教程
2020/06/18 Python
Python3 webservice接口测试代码详解
2020/06/23 Python
Python爬虫教程知识点总结
2020/10/19 Python
python文件路径操作方法总结
2020/12/21 Python
英国航空官网:British Airways
2016/09/11 全球购物
车间组长岗位职责
2013/12/20 职场文书
美术国培研修感言
2014/02/12 职场文书
公证书标准格式
2014/04/10 职场文书
2015年感恩母亲节的演讲稿
2015/03/18 职场文书
高中英语教学反思范文
2016/03/02 职场文书
Java数据结构之链表相关知识总结
2021/06/18 Java/Android
python数字图像处理实现图像的形变与缩放
2022/06/28 Python