理解JavaScript的prototype属性


Posted in Javascript onFebruary 11, 2012

其实,关于prototype只要几句话就可以总结:
任何原型都是对象,只有对象有原型
只有Function有prototype属性,它是这个Function作为构造器时生成对象所继承的原型。Function的原型和它的prototype属性无关
对象的原型可以通过非标准的属性 __proto__ 或ECMAScript5的方法 Object.getPrototypeOf() 访问。
1其实是错的,Object这个原型链尽头的对象它没有原型。可是为了更简单表述。在看原型链后你就会明白.toString()这类没有定义过的方法是怎样来的。
上面说的二义性,是文字理解上的,语法本身没有歧义。prototype是原型的意思,可是一个对象的原型不是由prototype去访问。
Function有prototype属性,可是和自己的原型没有关系。理解这点后,再去看关于原型链、继承的文章就容易理解多了。

下面是些例子,可以加深认识:

// 任何对象都有原型 
obj = {}; 
console.log( obj.__proto__ ); 
console.log( Object.getPrototypeOf(obj) ); 
console.log( obj.__proto__ === Object.getPrototypeOf(obj) ); //对象并没有语法意义的prototype属性 
alert(obj.prototype) //undefined 
//prototype作为一个属性,仅存在于Function中,代表以这个Function创建的新实例集成的原型,和Function本身的原型无关 
var F = function(name){ 
this.name = name; 
} 
obj = {a:3, 
get b (){ 
return this.a; 
} 
}; 
F.prototype = obj; 
newObj = new F('new name'); 
newObj.name; //作为构造器,name是newObj的自身属性 
newObj.a; //3 
//它继承了obj。可以通过这样证实: 
Object.getPrototypeOf( newObj ) === obj; // true 
newObj.__proto__ === obj; //true
Javascript 相关文章推荐
jquery绑定原理 简单解析与实现代码分享
Sep 06 Javascript
深入理解JavaScript系列(7) S.O.L.I.D五大原则之开闭原则OCP
Jan 15 Javascript
jQuery:节点(插入,复制,替换,删除)操作
Mar 04 Javascript
可以用鼠标拖动的DIV实现思路及代码
Oct 21 Javascript
javascript基于HTML5 canvas制作画箭头组件
Jun 25 Javascript
jQuery实现的导航条切换可显示隐藏
Oct 22 Javascript
Javascript 完美运动框架(逐行分析代码,让你轻松了运动的原理)
Jan 23 Javascript
VUEJS实战之构建基础并渲染出列表(1)
Jun 13 Javascript
谈谈因Vue.js引发关于getter和setter的思考
Dec 02 Javascript
利用D3.js实现最简单的柱状图示例代码
Dec 09 Javascript
vue富文本编辑器组件vue-quill-edit使用教程
Sep 21 Javascript
关于vue 项目中浏览器跨域的配置问题
Nov 10 Javascript
情人节专属 纯js脚本1k大小的3D玫瑰效果
Feb 11 #Javascript
基于jquery实现状态限定编辑的代码
Feb 11 #Javascript
通过jquery还原含有rowspan、colspan的table的实现方法
Feb 10 #Javascript
用JQuery实现表格隔行变色和突出显示当前行的代码
Feb 10 #Javascript
了解jQuery技巧来提高你的代码(个人觉得那个jquery的手册很不错)
Feb 10 #Javascript
基于jquery点击自以外任意处,关闭自身的代码
Feb 10 #Javascript
jqPlot 图表中文API使用文档及源码和在线示例
Feb 07 #Javascript
You might like
《DOTA3》开发工作已经开始 《DOTA3》将代替《DOTA2》
2021/03/06 DOTA
PHP日期时间函数的高级应用技巧
2009/05/16 PHP
Laravel6.2中用于用户登录的新密码确认流程详解
2019/10/16 PHP
Laravel修改验证提示信息为中文的示例
2019/10/23 PHP
tp5框架的增删改查操作示例
2019/10/31 PHP
prototype 1.5相关知识及他人笔记
2006/12/16 Javascript
IE6 弹出Iframe层中的文本框“经常”无法获得输入焦点
2009/12/27 Javascript
Extjs EditorGridPanel中ComboBox列的显示问题
2011/07/04 Javascript
初学Jquery插件制作 在SageCRM的查询屏幕隐藏部分行的功能
2011/12/26 Javascript
JQuery弹出层示例可自定义
2014/05/19 Javascript
Bootstrap插件全集
2016/07/18 Javascript
nodejs 十六进制字符串型数据与btye型数据相互转换
2018/07/30 NodeJs
JS实现点击生成UUID的方法完整实例【基于jQuery】
2019/06/12 jQuery
微信小程序3D轮播实现代码
2019/09/19 Javascript
js正则匹配多个全部数据问题
2019/12/20 Javascript
JavaScript进阶(四)原型与原型链用法实例分析
2020/05/09 Javascript
jQuery HTML设置内容和属性操作实例分析
2020/05/20 jQuery
js实现有趣的倒计时效果
2021/01/19 Javascript
python中sys.argv函数精简概括
2018/07/08 Python
python中reader的next用法
2018/07/24 Python
Flask Web开发入门之文件上传(八)
2018/08/17 Python
解决Python pandas plot输出图形中显示中文乱码问题
2018/12/12 Python
Python使用修饰器进行异常日志记录操作示例
2019/03/19 Python
python 循环数据赋值实例
2019/12/02 Python
Tensorflow 实现分批量读取数据
2020/01/04 Python
详解pandas绘制矩阵散点图(scatter_matrix)的方法
2020/04/23 Python
TensorFlow keras卷积神经网络 添加L2正则化方式
2020/05/22 Python
英国户外装备和冒险服装零售商:alloutdoor
2018/01/30 全球购物
北京振戎融通Java面试题
2015/09/03 面试题
网络工程师职业规划
2014/02/10 职场文书
艺术设计专业个人求职信
2014/04/10 职场文书
服务宗旨标语
2014/07/01 职场文书
2015关于重阳节的演讲稿
2015/03/20 职场文书
客户答谢会致辞
2015/07/30 职场文书
SQL语句多表联合查询的方法示例
2022/04/18 MySQL
Python面试不修改数组找出重复的数字
2022/05/20 Python