`
IvanLi
  • 浏览: 607774 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

javascript对象的property和prototype是这样一种关系

阅读更多
ECMAScript可以识别两种类型的对象,一种叫做Native Object属于语言范畴;一种叫做Host Object,由运行环境提供例如document对象,
Dom Node等
Native objects是一种松散的结构并且可以动态的增加属性(property),所有的属性都有一个名字和一个值,这个值可以是另一个对象的引用
或者是内建的数据类型(String, Number, Boolean, Null 或者 Undefined)
下面的这个简单的例子描述了一个javascript对象是如何设置一个属性的值和如何读取属性的值的。

赋值操作
一个对象的属性的创建非常简单,直接通过赋值操作就可以完成属性的创建。
var objectRef = new Object(); //create a generic javascript object.

一个名为testNumber的属性可以这样创建。
objectRef.testNumber = 5;
/* - or:- */
objectRef["testNumber"] = 5;

如果复制的属性名称已经存在那么不会再次创建这个属性,赋值操作仅仅是重新设置属性的值
objectRef.testNumber = 8;
/* - or:- */
objectRef["testNumber"] = 8;


js对象的原型(prototype)自己本身也可以是对象,也可以有属性(property),对于js对象的(prototype)的赋值操作跟普通对象属性的创建
没什么不同。

取值操作
在取值操作中property和prototype就不一样了,先看最简单的property取值操作。
/*为一个对象的属性赋值,如果这个对象没有这个属性,那么在赋值操作后,这个对象就有这个属性了 */
objectRef.testNumber = 8;
/* 读出这个属性的值 */
var val = objectRef.testNumber;

/* 现在val 就得到了刚才赋予objectRef的值8了*/

prototype揭密
[color=blue]
但是所有的对象都可以有prototypes, prototypes自己也是对象,那么他也可以有prototypes,这样循环下去就形成了一个prototype链,
这个链当他遇到链中队形的prototype是null时中止。(Object的默认的prototype是null)
var objectRef = new Object(); //create a generic javascript object.

创建一个新的js对象,这时这个对象的prototype是Null,所以objectRef的prototype链只包含一个对象Object.prototype
我们在看下面的代码
/* 构建MyObject1这个类型的构造函数
   MyObject1 - type.
*/
function MyObject1(formalParameter){
    /* 为者对象创建一个属性名字叫testNumber
    */
    this.testNumber = formalParameter;
}

/* 构建MyObject2这个类型的构造函数
   MyObject2 - type:-
*/
function MyObject2(formalParameter){
   /* 为者对象创建一个属性名字叫testString*/
    this.testString = formalParameter;
}

/* 下一步的操作会用MyObject1对象替换掉MyObject2默认的prototype属性*/
MyObject2.prototype = new MyObject1( 8 );

/* 最后我们创建MyObject2类型的一个对象*/

var objectRef = new MyObject2( "String_Value" );

objectRef这个MyObject2类型的对象有一个prototype的链,链中的第一个对象是MyObject1对象,MyObject1对象也有prototype,
这个prototype是Object默认的prototype,Object.prototype的prototype是null,至此这条prototype链结束。
当一个取值操作发生时,objectRef 的整个prototype链就开始工作
var val = objectRef.testString;

objectRef这个对象的有一个属性叫做testString,那么这句代码会把testString的值赋给val
var val = objectRef.testNumber;

在objectRef这个对象里并没有testNumber这个属性,但是val却的到了值8,而不是undefine,这是因为解释器在没有在当前对象找到要找
的属性后,就会去检查这个对象的prototype,objectRef的prototype是MyObject1对象,这个对象有testNumber这个属性,所以val得到8这个值。
var val = objectRef.toString;

现在val是个function的引用,这个function是Object.prototype的property,由于MyObject1和MyObject2都没有定义toString这个property
所以Object.prototype返回。
var val = objectRef.madeUpProperty;

最后val是undefined,因为MyObject1和MyObject2,还有Object都没有定义madeUpProperty这个property,所以得到的是undefine.

读操作会读取在obj自己和prototype 链上发现的第一个同名属性值
写操作会为obj对象本身创建一个同名属性(如果这个属性名不存在
这就意味着objectRef.testNumber = 3会在objectRef对象上创建一个property,名字是testNumber,当下一次在要读取testNumber时
propertype链就不会工作,仅仅会得到objectRef的property 3,而MyObject1的testNumber属性并不会被修改。下面的代码可以验证
/* 构建MyObject1这个类型的构造函数
   MyObject1 - type.
*/
function MyObject1(formalParameter){
    /* 为者对象创建一个属性名字叫testNumber
    */
    this.testNumber = formalParameter;
}

/* 构建MyObject2这个类型的构造函数
   MyObject2 - type:-
*/
function MyObject2(formalParameter){
   /* 为者对象创建一个属性名字叫testString*/
    this.testString = formalParameter;
}

/* 下一步的操作会用MyObject1对象替换掉MyObject2默认的prototype属性*/
var obj1 = new MyObject1( 8 );
MyObject2.prototype = obj1;

/* 最后我们创建MyObject2类型的一个对象*/

var objectRef = new MyObject2( "String_Value" );

alert(objectRef.testNumber);
objectRef.testNumber = 5;
alert(objectRef.testNumber);
alert(obj1.testNumber);


[/color]
分享到:
评论
28 楼 cai555 2007-04-18  
说得挺好的,收藏
27 楼 mayilance 2007-03-26  
不错,说得很清楚!
26 楼 mclockw 2007-03-23  
有收获,谢谢。
25 楼 andyandyandy 2007-03-23  
好文,收了
24 楼 IvanLi 2007-03-23  
jacky66666 写道
楼主:想请教一下,我一直对 prototype 有点疑惑!
function MyObject1(formalParameter){  
    this.testNumber = formalParameter;  
}
------------------------------------------------------------
MyObject1.prototype.aaa = function (){
    this.test = "test";
}
MyObject1.prototype.bbb = function (){
    this.test1 = "test1";
}
上面的代码相当于将 MyObject1 里面添加属性和方法
------------------------------------------------------------
function MyObject2(formalParameter){  
    this.testString = formalParameter;  


MyObject2.prototype = new MyObject1( 8 );
相当于 MyObject2 继承了 MyObject1 的所有属性和方法!
能不能把prototype理解成是类的所有属性和方法的集合!

不要用继承来理解prototype,prototype在java, c#里没有对应的概念,这篇帖子的主要目的是要说明prototype chain
23 楼 bouzouki 2007-03-23  
jacky66666 写道
楼主:想请教一下,我一直对 prototype 有点疑惑!
function MyObject1(formalParameter){  
    this.testNumber = formalParameter;  
}
------------------------------------------------------------
MyObject1.prototype.aaa = function (){
    this.test = "test";
}
MyObject1.prototype.bbb = function (){
    this.test1 = "test1";
}
上面的代码相当于将 MyObject1 里面添加属性和方法
------------------------------------------------------------
function MyObject2(formalParameter){  
    this.testString = formalParameter;  


MyObject2.prototype = new MyObject1( 8 );
相当于 MyObject2 继承了 MyObject1 的所有属性和方法!
能不能把prototype理解成是类的所有属性和方法的集合!


用plain js,一定要抛弃类的想法,一切都是对象,对象可以看成哈希表,
再理解了对象和prototype以及constructor的关系,js里prototype-based oo部分基本上就ok了
22 楼 jacky66666 2007-03-22  
楼主:想请教一下,我一直对 prototype 有点疑惑!
function MyObject1(formalParameter){  
    this.testNumber = formalParameter;  
}
------------------------------------------------------------
MyObject1.prototype.aaa = function (){
    this.test = "test";
}
MyObject1.prototype.bbb = function (){
    this.test1 = "test1";
}
上面的代码相当于将 MyObject1 里面添加属性和方法
------------------------------------------------------------
function MyObject2(formalParameter){  
    this.testString = formalParameter;  


MyObject2.prototype = new MyObject1( 8 );
相当于 MyObject2 继承了 MyObject1 的所有属性和方法!
能不能把prototype理解成是类的所有属性和方法的集合!
21 楼 lujiadontcry 2007-03-18  
thanks for lz & j2eeqk,i learnt a lot ~~~
20 楼 wszjdnssa 2007-03-17  
楼主讲的不错
受教了
继续学习
19 楼 gwallan 2007-03-13  
不错!
18 楼 approach 2007-03-09  
17 楼 bencode 2007-03-07  
嘿.看了这篇文章.我也写了一篇

http://bencode.iteye.com/admin/show/57760
16 楼 melin 2007-02-25  
类似ruby的单件类
http://www.iteye.com/topic/20352
15 楼 jvincent 2007-02-20  
js果然很厉害,而且并不是一般人认为的那样简单和易学
14 楼 wcjmaomao 2007-02-20  
非常感谢,让我更明白了prototype的意思!
13 楼 j2eeqk 2007-02-15  
不错!js是一门艺术!苏东坡诗云:横看成岭侧成峰,远近高低各不同!看来这句来形容js最恰当了。

希望downpour的杰作能尽快出炉。我看好js,更看好不同学问派对js的不同理解和杰出的造诣。

加油!

顺便给那些奋斗在AJAX,prototype,dojo,dwr,yui,json等科技前沿的研发人员提前拜一声早年,愿在新的一年里可以看到你们更好的作品。

加油!
12 楼 downpour 2007-02-15  
最近实在太忙,没有空更新了,应该会在1,2个月内完成。
11 楼 IvanLi 2007-02-15  
prototype你都写这种reference了吗?
10 楼 downpour 2007-02-14  
看看我对JavaScript中new操作符和prototype的理解,是否能对大家有所帮助。

http://www.demo2do.com/prototype/reference/zh-cn/Class.htm
9 楼 j2eeqk 2007-02-14  
这里我就Object.prototype简单说说。既然是Object,而万物皆Object。顾即:凡var能定义的对象均可以拿到Object.prototype该对象的属性。(因为prototype本身为一对象)

example:
存在
Object.prototype.a = 1;
Number.prototype.b = 2;
var i = new Number( 1 );
i.c = 3;
for( var p in i )
{
alert( p + ' ' + i[p] );
}
这里的结果是:a 1,b 2,c 3
而我们大量使用的var temp = function(){ this.XXX = YYY; }和
var temp = { XXX:YYY,... };更是能将这种思想体现出来。

当我们for( var p in XXX ){}的时候,如果XXX为Number,String,Boolean,Object,Function,则很容易理解我们遍历的是她们的.prototype对象的所有属性(成员),但除这些之外,比如是上面的temp,则还能拿到她们本身定义的内部成员。而例如最开始说的那个 i,实际上是在遍历prototype链尾的Object.prototype。

相关推荐

    电力系统中基于MATLAB的价格型需求响应与电价弹性矩阵优化

    内容概要:本文详细介绍了如何利用MATLAB进行价格型需求响应的研究,特别是电价弹性矩阵的构建与优化。文章首先解释了电价弹性矩阵的概念及其重要性,接着展示了如何通过MATLAB代码实现弹性矩阵的初始化、负荷变化量的计算以及优化方法。文中还讨论了如何通过非线性约束和目标函数最小化峰谷差,确保用户用电舒适度的同时实现负荷的有效调节。此外,文章提供了具体的代码实例,包括原始负荷曲线与优化后负荷曲线的对比图,以及基于历史数据的参数优化方法。 适合人群:从事电力系统优化、能源管理及相关领域的研究人员和技术人员。 使用场景及目标:适用于希望深入了解并掌握价格型需求响应机制的专业人士,旨在帮助他们更好地理解和应用电价弹性矩阵,优化电力系统的负荷分布,提高能源利用效率。 其他说明:文章强调了实际应用中的注意事项,如弹性矩阵的动态校准和用户价格敏感度的滞后效应,提供了实用的技术细节和实践经验。

    一级医院医疗信息管理系统安装调试技术服务合同20240801.pdf

    一级医院医疗信息管理系统安装调试技术服务合同20240801.pdf

    表5 文献综述.doc

    表5 文献综述.doc

    36W低压输入正激电源, 正激变压器设计方法步骤及谐振电感的设计方法,主要讲诉了正激电源变压器测的输入输出参数,按输入的条件设计相关的变压器的参数,同时将输出电感的设计方法一并例出,详细的设计步骤

    36W低压输入正激电源 变压器电感设计

    基于YOLOv8的深度学习课堂行为检测系统源码(含检测图片和视频)

    基于YOLOv8的深度学习课堂行为检测系统源码,软件开发环境python3.9,系统界面开发pyqt5。在使用前安装python3.9,并安装软件所需的依赖库,直接运行MainProgram.py文件即可打开程序。模型训练时,将train,val数据集的绝对路径改为自己项目数据集的绝对路径,运行train.py文件即可开始进行模型训练,内含项目文件说明,以及检测图片和视频。

    odbc-oracle zabbix模版原版

    odbc_oracle zabbix模版原版

    基于纳什谈判理论的风光氢多主体能源系统合作运行方法——综合能源交易与优化模型

    内容概要:本文探讨了利用纳什谈判理论来优化风光氢多主体能源系统的合作运行方法。通过MATLAB代码实现了一个复杂的优化模型,解决了风电、光伏和氢能之间的合作问题。文中详细介绍了ADMM(交替方向乘子法)框架的应用,包括联盟效益最大化和收益分配谈判两个子任务。此外,还涉及了加权残差计算、目标函数构造、可视化工具以及多种博弈模式的对比等功能模块。实验结果显示,合作模式下系统总成本显著降低,氢能利用率大幅提升。 适合人群:从事能源系统研究的专业人士、对博弈论及其应用感兴趣的学者和技术人员。 使用场景及目标:适用于需要优化多主体能源系统合作运行的场合,如工业园区、电网公司等。主要目标是提高能源利用效率,降低成本,增强系统的灵活性和稳定性。 其他说明:代码中包含了丰富的可视化工具,能够帮助研究人员更好地理解和展示谈判过程及结果。同时,提供了多种博弈模式的对比功能,便于进行性能评估和方案选择。

    C#与Halcon联合编程实现高效视觉几何定位与测量框架

    内容概要:本文详细介绍了如何利用C#与Halcon联合编程构建高效的视觉几何定位与测量框架。主要内容涵盖模板创建与匹配、圆测量、数据持久化以及图像采集等方面的技术细节。首先,通过创建形状模板并进行匹配,实现了工件的精确定位。接着,针对圆形物体的测量,提出了动态ROI绘制、亚像素边缘提取和稳健圆拟合的方法。此外,还讨论了模板管理和图像采集的最佳实践,确保系统的稳定性和高效性。最后,强调了Halcon对象的内存管理和错误处理机制,提供了实用的优化建议。 适合人群:具备一定编程基础,尤其是对C#和Halcon有一定了解的研发人员和技术爱好者。 使用场景及目标:适用于工业生产线上的自动化检测设备开发,旨在提高工件定位和尺寸测量的精度与效率。主要目标是帮助开发者掌握C#与Halcon联合编程的具体实现方法,从而构建稳定可靠的视觉检测系统。 其他说明:文中提供了大量实战代码片段和调试技巧,有助于读者快速理解和应用相关技术。同时,作者分享了许多实际项目中的经验和教训,使读者能够避开常见陷阱,提升开发效率。

    QT6 C++视频播放器实现(基于QGraphicsVideo)

    QT视频播放器实现(基于QGraphicsView)

    评估管线钢环焊缝质量及其对氢脆的敏感性.pptx

    评估管线钢环焊缝质量及其对氢脆的敏感性.pptx

    机器学习(预测模型):专注于 2024 年出现的漏洞(CVE)信息数据集

    该是一个在 Kaggle 上发布的数据集,专注于 2024 年出现的漏洞(CVE)信息。以下是关于该数据集的详细介绍:该数据集收集了 2024 年记录在案的各类漏洞信息,涵盖了漏洞的利用方式(Exploits)、通用漏洞评分系统(CVSS)评分以及受影响的操作系统(OS)。通过整合这些信息,研究人员和安全专家可以全面了解每个漏洞的潜在威胁、影响范围以及可能的攻击途径。数据主要来源于权威的漏洞信息平台,如美国国家漏洞数据库(NVD)等。这些数据经过整理和筛选后被纳入数据集,确保了信息的准确性和可靠性。数据集特点:全面性:涵盖了多种操作系统(如 Windows、Linux、Android 等)的漏洞信息,反映了不同平台的安全状况。实用性:CVSS 评分提供了漏洞严重程度的量化指标,帮助用户快速评估漏洞的优先级。同时,漏洞利用信息(Exploits)为安全研究人员提供了攻击者可能的攻击手段,有助于提前制定防御策略。时效性:专注于 2024 年的漏洞数据,反映了当前网络安全领域面临的新挑战和新趋势。该数据集可用于多种研究和实践场景: 安全研究:研究人员可以利用该数据集分析漏洞的分布规律、攻击趋势以及不同操作系统之间的安全差异,为网络安全防护提供理论支持。 机器学习与数据分析:数据集中的结构化信息适合用于机器学习模型的训练,例如预测漏洞的 CVSS 评分、识别潜在的高危漏洞等。 企业安全评估:企业安全团队可以参考该数据集中的漏洞信息,结合自身系统的实际情况,进行安全评估和漏洞修复计划的制定。

    QML Combobox 自动过滤,输入字符串后自动匹配

    博客主页:https://blog.csdn.net/luoyayun361 QML ComboBox控件,输入关键字后自动过滤包含关键字的列表,方便快速查找列表项

    【人工智能领域】人工智能技术发展历程、核心原理及应用指南:涵盖机器学习、深度学习、NLP和计算机视觉的全面介绍

    内容概要:本文全面介绍了人工智能技术的发展历程、核心技术原理、应用方法及其未来趋势。首先阐述了人工智能的定义和核心目标,随后按时间顺序回顾了其从萌芽到爆发的五个发展阶段。接着详细讲解了机器学习、深度学习、自然语言处理和计算机视觉等核心技术原理,并介绍了使用现成AI服务和开发自定义AI模型的应用方法。此外,还展示了智能客服系统、图像分类应用和智能推荐系统的具体实现案例。针对普通用户,提供了使用大模型的指南和提问技巧,强调了隐私保护、信息验证等注意事项。最后展望了多模态AI、可解释AI等未来发展方向,并推荐了相关学习资源。; 适合人群:对人工智能感兴趣的初学者、技术人员以及希望了解AI技术应用的普通大众。; 使用场景及目标:①帮助初学者快速了解AI的基本概念和发展脉络;②为技术人员提供核心技术原理和应用方法的参考;③指导普通用户如何有效地使用大模型进行日常查询和任务处理。; 其他说明:本文不仅涵盖了AI技术的基础知识,还提供了丰富的实际应用案例和实用技巧,旨在帮助读者全面理解人工智能技术,并能在实际工作中加以应用。同时提醒读者关注AI伦理和版权问题,确保安全合法地使用AI工具。

    本学习由 Matrix 工作室制作并开发,包括算法与数据结构的学习路线和各种题解

    本学习由 Matrix 工作室制作并开发,包括算法与数据结构的学习路线和各种题解。

    基于智慧图书馆基础业务流程Axure11高保真原型设计

    本项目致力于构建基于微服务架构的智慧图书馆管理平台,重点突破多校区图书馆异构系统间的数据壁垒。通过建立统一数据治理规范、部署智能分析模块、重构业务流程引擎,系统性实现以下建设目标:构建跨馆业务数据的标准化整合通道,实施容器化部署的弹性资源管理体系,开发具备机器学习能力的业务辅助决策系统,打造可量化评估的管理效能提升模型,最终形成支持PB级数据处理的分布式存储体系与全维度数据资产图谱。

    mysql中慢sql分析

    根据processlist查询出慢sql 1.修改配置文件中的mysql链接 2.目前是15秒执行一次获取执行时间在5秒上的sql,可以在配置中修改 3.执行后查出的慢sql会记录到log文件夹中以日期命名的txt文件中,可自行查验

    全域通航 低空经济服务平台建设实施方案.pptx

    全域通航 低空经济服务平台建设实施方案.pptx

    全国联合交通查询手册,涵盖各大城市

    全国交通一卡通互联互通服务手册,支持在线查询

    电力电子中移相全桥DC-DC变换器的Simulink离散化建模与优化

    内容概要:本文详细介绍了如何在Simulink中进行移相全桥DC-DC变换器的离散化建模及其优化。主要内容包括搭建主电路、PWM波形生成、数字PI调节器的设计以及针对负载突变情况下的闭环控制优化。文中特别强调了移相控制、死区时间设置、采样周期选择、积分限幅、前馈补偿等关键技术点的应用,确保在极端负载条件下(如从3kW突变为3.6W)输出电压仍能保持稳定。此外,作者还分享了许多实践经验,如避免非线性磁化曲线带来的数值振荡、合理设置仿真步长等。 适合人群:从事电力电子研究或开发的技术人员,尤其是对移相全桥变换器感兴趣的研究者和技术爱好者。 使用场景及目标:适用于需要深入了解移相全桥DC-DC变换器工作原理及其在Simulink环境下的离散化建模和优化的人群。目标是掌握如何通过合理的参数设定和算法改进,使系统能够在复杂工况下保持良好的性能。 其他说明:文中提供了大量具体的Matlab/Simulink代码片段,帮助读者更好地理解和实践相关概念。同时,作者也指出了许多常见的陷阱和注意事项,有助于初学者少走弯路。

    西门子S7-1200 PLC污水处理项目的博途V17程序设计与优化

    内容概要:本文详细介绍了西门子S7-1200 PLC在污水处理项目中的应用,涵盖模拟量处理、设备轮换、Modbus通讯控制以及事件记录等多个方面。具体包括:使用4-20mA超声波传感器进行液位检测并采用滑动窗口滤波法处理信号,确保液位波动控制在±2cm以内;通过SCL代码实现两组提升泵的智能轮换,避免长时间连续运行带来的设备损耗;利用Modbus TCP和RTU协议对变频器进行精确控制,确保鼓风机和其他设备的稳定运行;采用ALARM_S函数和循环存储队列实现高效的报警管理和事件记录。此外,文中还分享了许多实际操作中的经验和技巧,如硬件滤波与软件校验结合、防止设备同时启动的延时机制等。 适合人群:从事工业自动化领域的工程师和技术人员,尤其是熟悉西门子PLC编程和博途软件使用的专业人士。 使用场景及目标:适用于污水处理厂或其他类似工业环境中,旨在提高PLC系统的稳定性和可靠性,减少维护成本,延长设备使用寿命。通过对文中提供的代码片段和实践经验的学习,可以帮助工程师更好地理解和掌握PLC编程技巧,从而应用于实际工程项目中。 其他说明:文中不仅提供了具体的编程实例,还分享了很多宝贵的实战经验,如如何处理传感器异常、优化通讯协议配置等。这些内容对于初学者来说是非常宝贵的知识财富,能够帮助他们快速成长并在工作中游刃有余。

Global site tag (gtag.js) - Google Analytics