关于Javascript 的 prototype问题。


Posted in Javascript onJanuary 03, 2007

prototype

1、prototype是与Clone联系起来的,
也就是说,当创建实例时,prototype会把成员clone到该Class(function)的实例上。
Detail: 最常见的几个内置内对象里的prototype,如:Array原型有join, split方法,
当创建数组a时var a=[1,2],原型里的所有方法都被clone到a上。

2、this是该类的实例指针(该指针为"动态联编")。如何理解js this的动态联编,请参考我写的这篇文章:http://blog.never-online.net/article.asp?id=117
当创建该类实例时,实例具有预先定义的所有以this.p类似的成员。也具有prototype原型里定义的成员,如果类内部定义与prototype里的一个定义相同,则不是重写:

看这个例子,jsclass定义的this.func,还有prototype里定义的func,如果jsclass内部有成员与原型里的相同,实例化时优先权为this.func,但注意,原型里并不是重写func,而是jsclass实例共有的,虽然其优先权没有this.func高,与此同时,我们也可以以这种方式来理解prototype与类内部定义成员:

<script>
function jsclass() {
  this.p = "never-online";
  this.func = function () {
    alert('func');
  }
}
jsclass.prototype = {
  func : function () {
  alert(this.p);
  }
}
var a = new jsclass();
a.func();
delete a.func;
a.func();
</script>

我们再把上面的代码修改一下。这样看:

<script>
function jsclass() {
  this.p = "never-online";
  this.func = function () {
    alert('func');
  }
}
jsclass.prototype = {
  func : function () {
  alert(this.p?this.p:'no value');
  }
}
var a = new jsclass();
a.func();//调用内部成员
delete a.func;//此处删除是的类内部定义的func
a.func();//调用prototype成员
delete a.func;//试图再次删除func(prototype)
a.func();//删除无效(内部的func已经被删除),依然可打印输出
</script>

注释:类内部的成员可以用delete删除,而原型里定义的,则不能用delete 实例名.成员名来删除的。
如果用prototype定义后,实例化时:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象
也就是在上面的
delete a.func;//此处删除是的类内部定义的func
a.func();//调用prototype成员
之后,再次调用a.func(),调用时,通过调用prototype.func来实现的。而并非a.func(),这也解释了为什么在jsclass内部定义func与在prototype定义func时不会有重写现象。

Javascript 相关文章推荐
js FLASH幻灯片字符串中有连接符&的处理方法
Mar 01 Javascript
Seajs的学习笔记
Mar 04 Javascript
Lab.js初次使用笔记
Feb 28 Javascript
javascript实现数组中的内容随机输出
Aug 11 Javascript
JavaScript实现同时调用多个函数的方法
Nov 09 Javascript
JS实现table表格数据排序功能(可支持动态数据+分页效果)
May 26 Javascript
微信小程序实现多个按钮toggle功能的实例
Jun 13 Javascript
jQuery实现选中行变色效果(实例讲解)
Jul 06 jQuery
vue移动UI框架滑动加载数据的方法
Mar 12 Javascript
vue中的router-view组件的使用教程
Oct 23 Javascript
layui的面包屑或者表单不显示的解决方法
Sep 05 Javascript
5个实用的JavaScript新特性
Jun 16 Javascript
彻底搞懂JS无缝滚动代码
Jan 03 #Javascript
经典的解除许多网站无法复制文字的绝招
Dec 31 #Javascript
对象的类型:本地对象(1)
Dec 29 #Javascript
JavaScript高级程序设计
Dec 29 #Javascript
JavaScript 参考教程
Dec 29 #Javascript
js自带函数备忘 数组
Dec 29 #Javascript
slice函数的用法 之不错的应用
Dec 29 #Javascript
You might like
自制汽车收音机天线:收听广播的技巧和方法
2021/03/02 无线电
php 方便水印和缩略图的图形类
2009/05/21 PHP
php中时间轴开发(刚刚、5分钟前、昨天10:23等)
2011/10/03 PHP
详解PHP中的状态模式编程
2015/08/11 PHP
详解WordPress开发中用于获取分类及子页面的函数用法
2016/01/08 PHP
一段实用的php验证码函数
2016/05/19 PHP
php设计模式之适配器模式原理、用法及注意事项详解
2019/09/24 PHP
phpStudy vscode 搭建debug调试的教程详解
2020/07/28 PHP
jquery读取xml文件实现省市县三级联动的方法
2015/05/29 Javascript
jqGrid用法汇总(全经典)
2016/06/28 Javascript
老生常谈js动态添加事件--- 事件委托
2016/07/19 Javascript
vue.js中$set与数组更新方法
2018/03/08 Javascript
使用vue实现多规格选择实例(SKU)
2019/08/23 Javascript
layer弹出层取消遮罩的方法
2019/09/25 Javascript
vue keep-alive实现多组件嵌套中个别组件存活不销毁的操作
2020/10/30 Javascript
[01:25]2015国际邀请赛最佳短片奖——斧王《拆塔英雄:天赋异禀》
2015/09/22 DOTA
老生常谈python中的重载
2018/11/11 Python
python 实现语音聊天机器人的示例代码
2018/12/02 Python
Python 利用pydub库操作音频文件的方法
2019/01/09 Python
使用python模拟高斯分布例子
2019/12/09 Python
Python tkinter和exe打包的方法
2020/02/05 Python
将自己的数据集制作成TFRecord格式教程
2020/02/17 Python
Python3.x+pyqtgraph实现数据可视化教程
2020/03/14 Python
Python接口测试数据库封装实现原理
2020/05/09 Python
Selenium webdriver添加cookie实现过程详解
2020/08/12 Python
Python实现Kerberos用户的增删改查操作
2020/12/14 Python
中国最大的团购网站:聚划算
2016/09/21 全球购物
美国气象仪器、花园装饰和墙壁艺术商店:Wind & Weather
2019/05/29 全球购物
澳大利亚顶级美发和美容贸易超市:glamaCo
2020/01/19 全球购物
优秀学生获奖感言
2014/02/15 职场文书
商铺消防安全责任书
2014/07/29 职场文书
学校运动会广播稿范文
2014/10/02 职场文书
党的群众路线教育实践活动专题组织生活会发言材料
2014/10/17 职场文书
2014年汽车销售工作总结
2014/12/01 职场文书
学术会议邀请函
2015/01/30 职场文书
教你如何使用Python下载B站视频的详细教程
2021/04/29 Python