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 相关文章推荐
js function使用心得
May 10 Javascript
jquery实现非叠加式的搜索框提示效果
Jan 07 Javascript
Javascript 按位取反运算符 (~)
Feb 04 Javascript
js获取鼠标点击的位置实现思路及代码
May 09 Javascript
Jquery结合HTML5实现文件上传
Jun 25 Javascript
快速解决Canvas.toDataURL 图片跨域的问题
May 10 Javascript
js实现添加可信站点、修改activex安全设置,禁用弹出窗口阻止程序
Aug 17 Javascript
Vue.js使用v-show和v-if的注意事项
Dec 13 Javascript
详解JavaScript时间处理之几个月前或几个月后的指定日期
Dec 21 Javascript
详解Angular 4.x 动态创建组件
Apr 25 Javascript
详解用node搭建简单的静态资源管理器
Aug 09 Javascript
JavaScript中Object基础内部方法图
Feb 05 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
PHP静态新闻列表自动生成代码
2007/06/14 PHP
PHP has encountered an Access Violation at 7C94BD02解决方法
2009/08/24 PHP
php缩放图片(根据宽高的等比例缩放)实例介绍
2013/06/09 PHP
smarty模板局部缓存方法使用示例
2014/06/17 PHP
smarty模板引擎中内建函数if、elseif和else的使用方法
2015/01/22 PHP
php上传中文文件名乱码问题处理方案
2015/02/03 PHP
WordPress中的shortcode短代码功能使用详解
2016/05/17 PHP
PHP如何读取由JavaScript设置的Cookie
2017/03/22 PHP
PHP环形链表实现方法示例
2017/09/15 PHP
PHP curl批处理及多请求并发实现方法分析
2018/08/15 PHP
ExtJS的FieldSet的column列布局
2009/11/20 Javascript
jQuery探测位置的提示弹窗(toolTip box)详细解析
2013/11/14 Javascript
node.js中的fs.readSync方法使用说明
2014/12/17 Javascript
jQuery实现类似淘宝网图片放大效果的方法
2015/07/08 Javascript
支持移动端原生js轮播图
2017/02/16 Javascript
Vue自定义指令详解
2017/07/28 Javascript
nodejs图片处理工具gm用法小结
2018/12/12 NodeJs
微信小程序实现人脸识别登陆的示例代码
2019/04/02 Javascript
layer更改皮肤的实现方法
2019/09/11 Javascript
[01:36:17]DOTA2-DPC中国联赛 正赛 Ehome vs iG BO3 第一场 1月31日
2021/03/11 DOTA
Python GUI编程完整示例
2019/04/04 Python
Python模块汇总(常用第三方库)
2019/10/07 Python
利用pandas将非数值数据转换成数值的方式
2019/12/18 Python
html5 利用重力感应实现摇一摇换颜色可用来做抽奖等等
2014/05/07 HTML / CSS
澳大利亚购买最佳炊具品牌网站:Cookware Brands
2019/02/16 全球购物
Solaris操作系统的线程机制
2015/07/28 面试题
园林技术个人的自我评价
2014/01/08 职场文书
学校元旦晚会方案
2014/02/19 职场文书
小组口号大全
2014/06/09 职场文书
公司法人授权委托书范本
2014/09/12 职场文书
2014年党员自我评议对照检查材料
2014/09/20 职场文书
务虚会发言材料
2014/12/25 职场文书
检讨书模板大全
2015/05/07 职场文书
党员转正意见怎么写
2015/06/03 职场文书
婚宴领导致辞
2015/07/28 职场文书
Python sklearn分类决策树方法详解
2022/09/23 Python