关于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 设置选中行的样式的实现代码
May 24 Javascript
JSON 和 JavaScript eval使用说明
Jun 13 Javascript
Javascript模块化编程(三)require.js的用法及功能介绍
Jan 17 Javascript
浅析XMLHttpRequest的缓存问题
Dec 13 Javascript
jquery队列函数用法实例
Dec 16 Javascript
javascript实现表格排序 编辑 拖拽 缩放
Jan 02 Javascript
使用webpack-dev-server处理跨域请求的方法
Apr 18 Javascript
ng-alain表单使用方式详解
Jul 10 Javascript
在Vue 中使用Typescript的示例代码
Sep 10 Javascript
Vue程序调试的方法
Jun 17 Javascript
JavaScript实现多球运动效果
Sep 07 Javascript
JavaScript实现前端网页版倒计时
Mar 24 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
php中的时间处理
2006/10/09 PHP
PHP判断远程url是否有效的几种方法小结
2011/10/08 PHP
使用Apache的htaccess防止图片被盗链的解决方法
2013/04/27 PHP
用mysql_fetch_array()获取当前行数据的方法详解
2013/06/05 PHP
一个严格的PHP Session会话超时时间设置方法
2014/06/10 PHP
php版微信支付api.mch.weixin.qq.com域名解析慢原因与解决方法
2016/10/12 PHP
php实现QQ小程序发送模板消息功能
2019/09/18 PHP
jquery图片放大功能简单实现
2013/08/01 Javascript
简述JavaScript中正则表达式的使用方法
2015/06/15 Javascript
学习JavaScript设计模式之策略模式
2016/01/12 Javascript
JSON 的正确用法探讨:Pyhong、MongoDB、JavaScript与Ajax
2016/05/15 Javascript
AngularJS上拉加载问题解决方法
2016/05/23 Javascript
基于Bootstrap的UI扩展 StyleBootstrap
2016/06/17 Javascript
Angular外部使用js调用Angular控制器中的函数方法或变量用法示例
2016/08/05 Javascript
Angular-Ui-Router+ocLazyLoad动态加载脚本示例
2017/03/02 Javascript
详解Vue2.0配置mint-ui踩过的那些坑
2018/04/23 Javascript
一文秒懂JavaScript构造函数、实例、原型对象以及原型链
2020/08/25 Javascript
通过实例解析javascript Date对象属性及方法
2020/11/04 Javascript
vite2.0+vue3移动端项目实战详解
2021/03/03 Vue.js
Python中用于返回绝对值的abs()方法
2015/05/14 Python
Python实现的人工神经网络算法示例【基于反向传播算法】
2017/11/11 Python
Python面向对象class类属性及子类用法分析
2018/02/02 Python
对python程序内存泄漏调试的记录
2018/06/11 Python
Python3用tkinter和PIL实现看图工具
2018/06/21 Python
Python的几种主动结束程序方式
2019/11/22 Python
Pytorch中膨胀卷积的用法详解
2020/01/07 Python
TensorFlow实现checkpoint文件转换为pb文件
2020/02/10 Python
Django User 模块之 AbstractUser 扩展详解
2020/03/11 Python
Python-for循环的内部机制
2020/06/12 Python
浅析Python面向对象编程
2020/07/10 Python
Python reques接口测试框架实现代码
2020/07/28 Python
详解anaconda离线安装pytorchGPU版
2020/09/08 Python
pymongo insert_many 批量插入的实例
2020/12/05 Python
Corelle官方网站:购买康宁餐具
2016/11/02 全球购物
SheIn沙特阿拉伯:女装在线
2020/03/23 全球购物
党的群众路线教育实践活动查摆剖析材料
2014/10/10 职场文书