JavaScript prototype整理(网上的三种理解)
prototype属性,只有function对象中才具有的显式属性;
网上三种理解:
1:通过构造函数创建的普通对象,通过其constructor属性引用它的构造函数对象,从而间接引用(拥有)了构造对象中的prototype对象;
如图:
此观点的文章: 参看 jimichan的文章: 详解javascript类继承机制的原理 中的: “(说成间接的是因为每个object都有一个 constructor 属性指向它的构造函数)。”
非常感谢在此问题上,作者对我的回信;如有冒犯,敬请原谅;
2:构造函数创建对象时,copy prototype中的属性和代码给所创建的对象。从而使创建的对象拥有了prototype中的所有功能和属性;
如图:
此观点的文章: 参看 yiding_he的文章: 领悟 JavaScript 中的面向对象 中的: “ 在 JavaScript 中,用 new 关键字创建对象是执行了下面三个步骤的:
1. 创建一个新的普通对象;
2. 将方法对象的 prototype 属性的所有属性复制到新的普通对象中去。
3. 以新的普通对象作为上下文来执行方法对象。”
此观点在回贴中被 xieye反对
3:构造函数在创建对象时,把构造函数中的prototype引用赋给创建的普通对象;也就是说由构造函数创建的对象,都有一个指针指向prototype对象;
如图:
此观点的文章: 参看 李站的文章: 悟透javascript 中的 " 我们已经知道,用 var anObject = new aFunction() 形式创建对象的过程实际上可以分为三步:第一步是建立一个新对象;第二步将该对象内置的原型对象设置为构造函数prototype引用的那个原型对象;第三步就是将该对象作为this参数调用构造函数,完成成员设置等初始化工作。对象建立之后,对象上的任何访问和操作都只与对象自身及其原型链上的那串对象有关,与构造函数再扯不上关系了" 以及 “语法甘露 中的:上面代码的最后一句证明,新创建的对象的constructor属性返回的是Object函数。其实新建的对象自己及其原型里没有constructor属性,那返回的只是最顶层原型对象的构造函数,即Object。”
综上所述:根据贴子: 领悟 JavaScript 中的面向对象 中作者 afcn0的回贴 “其实还有补充,就是如果构造函数返回object类型,那new对象无效,prototype问题是楼主还不太了解prototype继承方式,__proto__属性,以及isPrototypeOf方法所至 ” 的提示,查阅了文章: javascript中的继承
- 此文中提到:jane = new Engineer("Doe, Jane", ["navigator", "javascript"], "belau");
- 调用这句时,都发生了什么:
- 1 当js看见new操作符,它创建一个新的普通对象,并且设置它的__proto__ 属性为Engineer.prototype。
- 2 new 操作符传递这个新的对象作为Engineer 构造器的this的值。
- 其实最主要做的事就是上面的两件,剩下的都是很简单的函数调用.
根据上文的提示作了简单测试:
- function person(name,b){
- this.name=name;
- }
- person.prototype.sayHello=function(a){
- //alert("hello,i am "+this.name);
- alert(this==a);
- }
- function employee(name, salary)
- {
- person.call(this, name); //调用上层构造函数
- this.salary = salary; //扩展的成员
- };
- var p=new person("yangsp",p);
- //p.sayHello(p);
- //alert(p.constructor);
- //下面两句验证了普通对象中确有_proto_属性,且引用的是prototype对象;(在ff下调试,ie下不可);
- alert(p.__proto__==person);
- alert(p.__proto__==person.prototype))
- //alert("p有prototype属性吗? "+p.prototype); //表明普通对象中没有prototype属性;
总结:
- 比较赞同第三种理解;
- 即:prototype是function对象中专有的属性。
- _proto_是普通对象的隐式属性,在new的时候,会指向prototype所指的对象;
- 普通对象中的constructor属性指向构造函数,因此一个用构造函数创建的对象可能有两种方式关联到prototype.但继承应该是根据_proto_关联到prototype属性;
另外: ecma-262 中提到:every object created by that constructor has an implicit reference to the prototype (called the object's prototype) associated with its constructor 以及其图示;不敢肯定它的implicit reference间接还是隐式链接;
感谢所有提借帮助的作者。若有冒犯,敬请原谅;由于本人是新手,所有结论都是根据网上资源整理后自己猜测得出的;所以会有很多错误,真诚期待你的指正;
JavaScript prototype整理(网上的三种理解)相关推荐
- JavaScript 身份证号有效验证详解及实例代码
这篇文章主要介绍了JavaScript 身份证号有效验证详解及实例代码的相关资料,需要的朋友可以参考下 JavaScript验证身份证号 1 2 3 4 5 6 7 8 9 10 11 12 13 1 ...
- oracle表稅片整理,oracle_Oracle表碎片整理操作步骤详解,高水位线(HWL)下的许多数据 - phpStudy...
Oracle表碎片整理操作步骤详解 高水位线(HWL)下的许多数据块都是无数据的,但全表扫描的时候要扫描到高水位线的数据块,也就是说oracle要做许多的无用功!因此oracle提供了shrink s ...
- JavaScript对TreeView的操作全解
JavaScript对TreeView的操作全解 JavaScript对TreeView的操作全解 <script language="C#" runat="ser ...
- Java经典面试题整理及答案详解(八)
简介: Java经典面试题第八节来啦!本节面试题包含了进程.线程.Object类.虚拟内存等相关内容,希望大家多多练习,早日拿下心仪offer- 了解更多: Java经典面试题整理及答案详解(一) J ...
- Java经典面试题整理及答案详解(三)
简介: 以下是某同学面试时,面试官问到的问题,关于面试题答案可以参考以下内容- 上一篇:Java经典面试题整理及答案详解(二) Java面试真题第三弹接住!相信通过前两节的学习,大家对于Java多少有 ...
- JavaScript prototype
http://www.cnblogs.com/dolphinX/p/3286177.html JavaScript prototype 用过JavaScript的同学们肯定都对prototype如雷贯 ...
- JavaScript数据结构与算法——链表详解(下)
在JavaScript数据结构与算法--链表详解(上)中,我们探讨了一下链表的定义.实现原理以及单链表的实现.接下来我们进一步了解一下链表的其他内容. 1.双向链表 双向链表实现原理图: 与单向链表不 ...
- JavaScript数据结构与算法——链表详解(上)
注:与之前JavaScript数据结构与算法系列博客不同的是,从这篇开始,此系列博客采用es6语法编写,这样在学数据结构的同时还能对ECMAScript6有进一步的认识,如需先了解es6语法请浏览ht ...
- JavaScript数据结构与算法——队列详解(下)
接下来会借助本人另一篇文章JavaScript数据结构与算法--队列详解(上)中实现的队列类及其方法实现一个应用. 配对问题 需求分析:在一个文件中保存着一份男女混合的数据,名称前以B开头表示男士,以 ...
最新文章
- Windows下Python安装及pycharm,pip下载和安装第三方库
- python编程基础与应用-Python编程基础与应用
- 山东专升本access知识点_专升本计算机速背知识点(十八)
- 微软MSDN中文网络广播(Webcast)——Visual Studio 2010 ALM应用实践系列课程预告(2011)...
- 小波降噪与重构例子 python
- 02.操作系统概述.md
- (软件工程复习核心重点)第六章实现和测试-第四节:集成测试
- HTC ThunderBolt无法打开3G问题解决方法
- 第 6 章 存储 - 039 - Data Volume 之 bind mount
- C++经典书籍推荐 .
- 脚本——监控打印服务
- 我读《非暴力沟通》- 马歇尔 *卢森堡 - 是什么蒙蔽了爱
- springboot框架直接访问静态页面
- 幼儿园调查过程怎么写_如何写幼儿园调查问卷总结
- Git GitHub入门
- 【系统集成项目管理工程师】项目资源管理
- 【降价提醒】,您关注的商品已降价!
- 婚宴座位图html5,结婚酒席座位安排
- Aspose.word组件介绍
- 还没学会微服务?这份最全微服务总结送给你
热门文章
- hdu4907 水dp 或者set
- C语言-二维数组做函数的参数
- 【Android 启动过程】Activity 启动源码分析 ( Activity -> AMS、主线程阶段 )
- 【Flutter】Future 与 FutureBuilder 异步编程代码示例 ( FutureBuilder 构造函数设置 | 处理 Flutter 中文乱码 | 完整代码示例 )
- 【Android 内存优化】垃圾回收算法 ( 分代收集算法 | Serial 收集器 | ParNew 收集器 | Parallel Scavenge 收集器 | CMS 并发标记清除收集器 )
- 末学者daylight__Linux磁盘管理及LVM
- vue项目中批量打印二维码
- VS2010/MFC编程入门之三十(常用控件:树形控件Tree Control 上)
- LightTools 切趾角度设置
- 原码、反码、补码解析,保证一次搞懂