我所知的javascript之prototype

一:prototype大概概念和用途
“prototype”字面翻译是“原型”,是javascript实现继承的主要手段。粗略来说就是:prototype是javascript中的函数(function)的一个保留属性,并且它的值是一个对象(我们可以称这个对象为"prototype对象"),
通过以此函数作为构造函数构造出来的对象都自动的拥有构造函数的prototype对象的成员属性和方法。
其中的要点是:
1.prototype是函数(function)的一个必备属性(书面一点的说法是"保留属性")(只要是function,就一定有一个prototype属性)
2.prototype的值是一个对象
3.可以任意修改函数的prototype属性的值。
4.一个对象会自动拥有这个对象的构造函数的prototype的成员属性和方法
例子代码:
//定义一个函数(构造函数),并定义一些属性和方法用来给另外一个构造函数构造出来的对象继承
var function1=function(){
    this.name="function1";
    this.saySomething=function(){alert("This's a method of "+this.name);}//定义一个方法
}

//定义另外一个构造函数
var function2=function(){
    
}

function2.prototype=new function1();//将构造函数function2的prototype属性设置为一个由function1构造出来的对象,以便使由function2构造出来的对象(并且原本是没有任何属性和方法的对象)拥有function1的属性和方法
var obj1=new function1();
obj1.saySomething();//obj1本来什么成员也没有,多得prototype机制,是它坐享其成地拥有了function1对象的属性和方法。
当然,上述例子离真正实际上使用的“继承”还相差甚远,但也体现出继承的意义:一个对象拥有了另一个对象的属性和方法。(如儿子拥有了老爸的血型和脾气,人类继承了动物的本能如进食和打斗等等)

 

二:prototype的背后发生了什么?
以上部分大概阐述了prototype的概念和作用,但单凭这些还不够对prototype加深认识。现在来看看prototype背后是怎样工作的:
先来看看用new形式创建对象的过程:
var obj=new func();//以func()作为构造函数创建一个对象obj
这个过程是这样的:javascript引擎首先遇到了关键字new后,马上开辟了一块内存,创建了一个空对象(并且将this指向这个对象),接着执行构造函数func()对这个空对象进行构造(构造函数里面有什么属性和方法都一一给这个空白对象装配上去,这也就是为什么构造函数叫“构造函数”的原因)
其实,new和执行构造函数之间还有一件事引擎没有显式地告诉我们,而是偷偷地做了,这就是给这个空对象赋予prototype对象。
这里不得不提到一个跟prototype一样同样是系统保留而且同样重要的东西:__proto__
__proto__是一个对象自动拥有的内置属性(请注意:prototype是函数的内置属性,__proto__是对象的内置属性,但它们最终都指向同一个对象,就是那个用来被继承的对象),用chrome和FF都可以访问到一个对象的__proto__属性,IE就不可以。
正是一个对象的__proto__指向着这个对象的构造函数的prototype对象,才使这个对象认识了它的构造函数的prototype对象,并拥有了这个prototype对象的属性和方法。
所以var obj=new func()这个过程更具体是这样的:
1.javascript解析引擎遇到new后,开辟一片内存并创建了一个空对象,并且将“this”指向这个空对象
2.javascript解析引擎将这个空对象的__proto__指向后面紧跟着的构造函数默认的prototype对象(一指向到prototype对象后,解析引擎就知道了“噢,这个对象要拥有这个prototype对象的属性和方法了”)
3.javascript解析引擎执行构造函数体内的代码,也就正式开始对这个空对象进行构造(或者说装配)的过程了(this.name="xxx",this.sayHello=function(){...}等等)
4.对象被构造装配好,并赋值到等号左边的变量。
三:后记
我在尝试比较js中使用call与prototype实现继承的优缺点的过程中曾遇到过一个问题,并在csdn论坛上求助过,有兴趣的可以点击看一下http://topic.csdn.net/u/20111119/12/c40f4674-6142-4c4a-a532-9580f2baed8d.html,这是这个问题使我加速了对prototype的了解。在此多谢一下为我解答的liangws。
正如本文题目所说的,这些都是“我所知的javascript”,由于本人水平有限,本文描述肯定有不正确的地方,所以仅供参考,如发现有错误的地方欢迎拍砖。

转载于:https://www.cnblogs.com/lwhkdash/archive/2011/11/23/2260051.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/410249.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

哪些模块可用于python性能分析_Python调用C模块以及性能分析

一.c,ctypes和python的数据类型的对应关系ctypes type ctype Python typec_char char 1-character stringc_wchar wchar_t 1-character unicode stringc_byte char int/longc_ubyte unsigned char int/longc_short short int/longc_ushort unsigned short int/longc…

[html] webp与jpg、png比较,它有什么优劣势?如何选择?

[html] webp与jpg、png比较,它有什么优劣势?如何选择? 优势更优的图像数据压缩算法 带来更小的图片体积肉眼识别无差异的图片质量支持有损和无损压缩支持动画 透明色彩丰富 24-bit颜色数劣势存在兼容性问题选择​ 当 图片较少 体积不大 且存…

Alt Gr or Shift

This is interesting. The keyboard here is different from what we always use in China. Characters and layout are different. Hans gave me the password to logon the system. There s a “” character in it. With Chinese keyboard, I will use “Shift 2″ to gener…

Vue之前端页面使用json编辑框

转自: https://blog.csdn.net/Wjhsmart/article/details/85757045 转载于:https://www.cnblogs.com/jiushixihuandaqingtian/p/11310713.html

[html] html5的video如何附带字幕?

[html] html5的video如何附带字幕&#xff1f; <video controls width"400" height"300"> <source src"../hangge.mp4" type"video/mp4"> <track src"hangge.vtt" srclang"zh" kind"subtitl…

window.addeventlistener 不能调用方法_Java入门第十四课:如何定义”方法“

第十四课&#xff0c;学习定义方法。一个对象包含三种最常见的成员&#xff1a;构造器、Field和方法。Field用于定义状态数据&#xff0c;而方法是行为特征的抽象。那么什么是方法呢&#xff1f;在Java中&#xff0c;方法就是用来完成解决某件事情或实现某个功能的办法。方法实…

remmina连接xfce桌面的centos7

vnc无法连到linux server&#xff0c;但ssh可以的解决方法 原文引自&#xff1a;https://blog.csdn.net/h00ahaha/article/details/84440449 今天用vnc连远程服务器&#xff0c;一直给我提示Failed to connect to server.记录下解决该问题的步骤&#xff1a;1 确认ssh能登录&am…

[html] 你有使用过html5的rt标签吗?它有什么应用场景?

[html] 你有使用过html5的rt标签吗&#xff1f;它有什么应用场景&#xff1f; <ruby>汉 <rt>Hn</rt>字 <rt>Z</rt> </ruby>个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c; 但坚持一定很酷。欢迎大…

深度测试与alpha混合(3)

alpha源混合系数通常设置为D3DBLEND_SRCALPHA&#xff0c;即当前绘制像素的alpha值。目标混合系数设置为D3DBLEND_INVSRCALPHA&#xff0c;即1减去当前绘制像素的alpha值。那么当前绘制像素的alpha值又是如何得到的呢&#xff1f;如果没有使用材质和纹理&#xff0c;当前绘制像…

python开发商城实战_python框架Django实战商城项目之工程搭建

项目说明该电商项目类似于京东商城&#xff0c;主要模块有验证、用户、第三方登录、首页广告、商品、购物车、订单、支付以及后台管理系统。项目开发模式采用前后端不分离的模式&#xff0c;为了提高搜索引擎排名&#xff0c;页面整体刷新采用jinja2模板引擎实现&#xff0c;局…

算法之排序算法-shell排序(移位法)

个人觉得移位法就是借希尔排序进行分组,插入排序进行排序 注释是上一篇的交换法. 而且这种移位排序的真的很快 package com.ebiz.sort;import java.text.SimpleDateFormat; import java.util.Date;/*** author YHj* create 2019-07-30 8:53* shell排序-交换法*/ public class S…

[html] 页面布局时你使用最多的标签是什么?div吗?在什么情况下会使用到div?

[html] 页面布局时你使用最多的标签是什么&#xff1f;div吗&#xff1f;在什么情况下会使用到div&#xff1f; 页面的的整体布局使用<header> <main> <aside> <footer> 等。 一些细分的布局使用<div>&#xff0c;并指定适当的class、role和ari…

Effulgent的《深入理解Direct3D9》整理版(转)

深入理解Direct3D9 深入理解D3D9对图形程序员来说意义重大&#xff0c;我把以前的一些学习笔记都汇总起来&#xff0c;希望对朋友们有些所帮助&#xff0c;因为是零散笔记&#xff0c;思路很杂&#xff0c;还请包涵。 其实只要你能完美理解D3DLOCK、D3DUSAGE、D3DPOOL、LOST DE…

我的世界光影mod怎么用_玩转光影!闪光灯、反光板怎么用才高级?

光线对于拍摄的重要性不言而喻&#xff0c;有人甚至说&#xff1a;掌握了光线&#xff0c;你就掌握了摄影。今天我们就来谈谈摄影中和“光”关系最密切的两个器材&#xff1a;闪光灯、反光板。闪光灯的种类之前也跟大家介绍过闪光灯的种类&#xff0c;如果只说较为常用的&#…

https证书pfx 生成 pem,crt,key

(1)将.pfx格式的证书转换为.pem文件格式:openssl pkcs12 -in xxx.pfx -nodes -out server.pem(2)从.pem文件中导出私钥server.key&#xff1a;openssl rsa -in server.pem -out server.key(3)从.pem文件中导出证书server.crt openssl x509 -in server.pem -out server.crt转载…

sklearn所需要的知识点

NumPy NumPy&#xff08;Numerical Python的简称&#xff09;是Python的一种开源的数值计算扩展。这种工具可用来存储和处理大型矩阵&#xff0c;比Python自身的嵌套列表&#xff08;nested list structure&#xff09;结构要高效的多&#xff08;该结构也可以用来表示矩阵&am…

[html] 如何在网页中嵌入公司地址的地图?

[html] 如何在网页中嵌入公司地址的地图&#xff1f; <script srchttp://api.map.baidu.com/api?v2.0&akBG9Wtw7egUbIQHPjG9ayOLQO> </script> <script> (function(){ var map new BMap.Map("container"); //设置底图 map.centerAndZoom(&q…

sql游标以及异常处理

DECLARE emsgoutid UNIQUEIDENTIFIER ;DECLARE sendtime VARCHAR(20) ;DECLARE temptime DATETIME ;DECLARE sms_cursor CURSOR FORSELECT emsgoutid FROM dbo.emsg_out-- 打开游标OPEN sms_cursorFETCH NEXT FROM sms_cursorINTO emsgoutidWHILE FETCH_STATUS 0 BEGIN--tryBE…

正弦定理和余弦定理_那些让你加快解题速度的高中数学公式-26 利用三正弦、三余弦定理快速解题...

作者&#xff1a;本质教育 韦卓甫简单的题目做得又快又对对于任何考试&#xff08;例如高考&#xff09;&#xff0c;本质教育有一条重要的原则&#xff1a;那些考试拿高分的&#xff0c;一定是简单的题目做得又快又对&#xff0c;这样他们才有时间去思考难题。因此&#xff0c…

[html] 如何扩大CheckBox点击区域

[html] 如何扩大CheckBox点击区域 用 label 包裹&#xff0c;扩大 label 尺寸个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c; 但坚持一定很酷。欢迎大家一起讨论 主目录 与歌谣一起通关前端面试题