理解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实现图片的前进与后退功能
Apr 24 Javascript
javascript读写json示例
Apr 11 Javascript
JQuery打造省市下拉框联动效果
May 18 Javascript
Js可拖拽放大的层拖动特效实现方法
Feb 25 Javascript
利用jQuery及AJAX技术定时更新GridView的某一列数据
Dec 04 Javascript
js获取Get值的方法
Sep 29 Javascript
javascript 判断当前浏览器版本并判断ie版本
Feb 17 Javascript
浅谈vue-router 路由传参的方法
Dec 27 Javascript
重学JS 系列:聊聊继承(推荐)
Apr 11 Javascript
JS函数进阶之prototy用法实例分析
Jan 15 Javascript
nuxt静态部署打包相对路径操作
Nov 06 Javascript
ztree+ajax实现文件树下载功能
May 18 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
php zend 相对路径问题
2009/01/12 PHP
纯真IP数据库的应用 IP地址转化成十进制
2009/06/14 PHP
PHPEXCEL 使用小记
2013/01/06 PHP
codeigniter实现get分页的方法
2015/07/10 PHP
Yii2框架使用计划任务的方法
2016/05/25 PHP
PHP用户验证和标签推荐的简单使用
2016/10/31 PHP
PHP 实现 JSON 数据的编码和解码操作详解
2020/04/22 PHP
PHP实现页面静态化深入讲解
2021/03/04 PHP
无阻塞加载脚本分析[全]
2011/01/20 Javascript
扩展IE中一些不兼容的方法如contains、startWith等等
2014/01/09 Javascript
Javascript基础教程之JavaScript语法
2015/01/18 Javascript
javascript实现继承的简单实例
2015/07/26 Javascript
ES6新特性之解构、参数、模块和记号用法示例
2017/04/01 Javascript
Vue中的数据监听和数据交互案例解析
2017/07/12 Javascript
jQuery实现购物车的总价计算和总价传值功能
2018/11/28 jQuery
angular中两种表单的区别(响应式和模板驱动表单)
2018/12/06 Javascript
Layer.js实现表格溢出内容省略号显示,悬停显示全部的方法
2019/09/16 Javascript
利用python numpy+matplotlib绘制股票k线图的方法
2019/06/26 Python
django 框架实现的用户注册、登录、退出功能示例
2019/11/28 Python
python实现矩阵和array数组之间的转换
2019/11/29 Python
django实现HttpResponse返回json数据为中文
2020/03/27 Python
Python自动巡检H3C交换机实现过程解析
2020/08/14 Python
用HTML5 Canvas API中的clearRect()方法实现橡皮擦功能
2016/03/15 HTML / CSS
英国高级百货公司:Harvey Nichols
2017/01/29 全球购物
英国安全产品购物网站:The Safe Shop
2017/03/20 全球购物
Java里面Pass by value和Pass by Reference是什么意思
2016/05/02 面试题
物业管理专业个人的自我评价
2013/11/19 职场文书
四年级语文教学反思
2014/02/05 职场文书
化工操作工岗位职责
2014/04/29 职场文书
大型活动组织方案
2014/05/10 职场文书
高速铁道技术专业求职信
2014/08/09 职场文书
学生会感恩节活动方案
2014/10/11 职场文书
升学宴家长致辞
2015/07/27 职场文书
2016年学校“3.12”植树节活动总结
2016/03/16 职场文书
Html5页面播放M4a音频文件
2021/03/30 HTML / CSS
Java实现扫雷游戏详细代码讲解
2022/05/25 Java/Android