- 浏览: 957475 次
- 性别:
- 来自: 北京
-
文章分类
- 全部博客 (383)
- JSP 自定义标签实现 (1)
- JSP (2)
- javascript (161)
- JAVA (100)
- HTML (26)
- jQuery (11)
- J2EE (1)
- Log4J (1)
- HTML5 (6)
- DB2 (2)
- Spring (14)
- 浏览器兼容 (1)
- JavaMail (1)
- JAVA(转载) (1)
- freemarker (1)
- 项目管理 (1)
- 项目架构学习 (1)
- Oracle (11)
- 开源项目 (2)
- 网络编程 (4)
- C (1)
- C++ (0)
- Xpath (1)
- 待写 (10)
- JXL (1)
- XML (1)
- JNDI (2)
- POI (8)
- Struts2 (3)
- 异常解决方法 (1)
- Sql Server (2)
- windows (2)
- SqlServer (1)
- 前端 (1)
- 正则表达式 (2)
- 浏览器兼容问题 (2)
- 转载 (25)
- css (11)
- svn (5)
- 工程构建 (1)
- 好用的网站 (1)
- sql (3)
- chrome V8 (1)
- javacript 报表 (1)
- FusionCharts (1)
- eclipse (2)
- tomcat (4)
- hibernate (2)
- 硬件 (1)
- 杂烩 (1)
- Linux (1)
- ubuntu (1)
- 设计模式 (2)
- 缓存 (1)
- 数据库 (1)
- JVM (2)
- DOM4j (1)
- 其他 (1)
- JACOB (1)
- extjs (3)
- ligerUi (1)
- 在线HTML编辑器 (1)
- API (1)
- OpenOffice (1)
- webservice (1)
- json (1)
- 百度map (1)
- NodeJs (1)
- greeplum jdbc spring (1)
- easyui (1)
- hightchart (1)
- 游戏 (1)
- HttpClient (1)
- 正则 (1)
- canvas (4)
- HTML5,javascript,canvas (0)
最新评论
-
changelo:
缺少了秦皇岛市
中国省,市,区 json数据 -
yurui829:
解析配置行那等号前后有可能有空格,改为如下比较好:String ...
java 读取.ini配置文件工具类 -
贝塔ZQ:
poi生成excel文档,感觉蛮复杂的,可以试试用pageof ...
POI生成excel带下拉 -
langke93:
我发现greenplum 通过jdbc insert性能很差, ...
jdbc 配置连接greeplum数据,spring配置连接greeplum数据(简单配置学习) -
zhutulang:
哪有收邮件???
Spring 邮件接收发送实例
先看张对老手不新鲜但对菜鸟很有趣的图:
What the heck is that? 简直是luan lun。
new
抛开上面的图,先看看上篇文章留下的第二个问题,让我们在构造器的函数体内加点东西,看会发生什么。
function A(){this.p = 1}
var a = new A()
会得到如下结果:
为什么用new关键字构造出来的a,会获得p这个属性?new A()这行代码做了什么事情?根据上篇文章中Function的创建过程第4步,A这个对象会有一个Construct属性(注意不是constructor,Consturct是ECMAScript标准里的属性,好像对外不可见),该属性的值是个函数,new A()即会调用A的这个Construct函数。那么这个Construct函数会做些啥呢?
1, 创建一个object,假设叫x。
2, 如果A.prototype是个object(一般都是),则把A.prototype赋给x.__proto__;否则(不常见),请大老板Object出马,把Object.prototype赋给x.__proto__。
3, 调用A.call(x),第一个参数传入我们刚刚创建的x。这就妥了,A的函数体里this.p = 1,这个this,就成了x。因此x就有了p这个属性,并且x.p = 1。
4, 一般情况下,就返回x了,这时a就是x了。但也有特殊情况,如果A的函数体里返回的东西,它的类型(typeof)是个object。那么a就不是指向x了,而是指向A函数返回的东西。
伪代码如下:
var x = new Object(); //事实上不一定用new来创建,我也不清楚。
x.__proto__ = A.prototype
var result = A.call(x)
if (typeof(result) == "object"){
return result;
}
return x;
在我们的例子里,A函数返回undefined(因为没有return字眼),所以a就是x。但我们举个例子,验证下上面第4步里的特殊情况:
果然。
对象的constructor属性
再看看上篇文章留下的第一个问题
function Base(){}
Base.prototype.a = 1
var base = new Base();
function Derived(){}
Derived.prototype = base;
var d = new Derived()
执行完上面的代码,mybase.constructor很容易猜到是Base,那么d.constructor呢?是Derived吗?
不对,也是Base,怎么回事?很简单,复习下上篇的内容就知道:由于d本身没有constructor属性,所以会到d.__proto__上去找,d.__proto__就是Derived.prototype,也就是base这个对象,base也没constructor属性,于是再往上,到base.__proto__上找,也就是Base.prototype。它是有constructor属性的,就是Base本身。事实上,就我目前所知,只有构造器(function类型的object)的prototype,才真正自己拥有constructor属性的对象,且“构造器.prototype.constructor === 构造器”。
Instanceof
那么,instanceof怎么样?
从图中可以看出,d是Base、Derived和Object的实例。很合理,但这是怎么判断的呢?是这样的:对于x instanceof constructor的表达式,如果constructor.prototype在x的原型(__proto__)链里,那么就返回true。很显然,d的__proto__链往上依次是:Derived.prototype, Base.prototype, Object.prototype,得到图中结果就毫无疑问了。所以,instanceof跟对象的constructor属性无关。
Function and Object
最后解答一下文章开头的图。
Function和Object本身也是function类型的对象,因此可以说都是Function()构造出来的东西(自己构造自己,我不知道具体是不是这样,但就这么认为,挺合理的。)
也就是说,可以设想如下代码:
var Function = new Function()
var Object = new Function()
根据上篇文章的规律,会有Function.__proto__ === Function.prototype,以及Object.__proto__ === Function.prototype,验证一下:
Function instanceof Object,这是显然为true的,万物归Object管,Function的__proto__链依次指向:Function.prototype,Object.prototype。
Object instanceof Function,因为Function.prototype在Object的__proto__链中,所以也为true。
发表评论
-
微信2.0分享自定义标题、图片、摘要、链接
2016-01-28 11:00 1143今天做了一个微信自 ... -
js验证正则大全
2015-06-30 13:41 943var regexEnum = { intege:& ... -
javascript判断字符串是否是回文的算法实现
2014-11-24 22:40 3849var str = "reaaer&qu ... -
HTML5学习记录-----canvas学习之动画快照
2014-11-24 21:33 1200canvas动画快照 欢迎大家有好点建议可以提。js高级 ... -
HTML5学习记录-----canvas学习之鼠标选取放大图像
2014-11-23 21:53 1423canvas鼠标选取放大 欢迎大家有好点建议可以提。js ... -
HTML5学习记录-----canvas学习之获取鼠标在canvas上的坐标位置
2014-11-22 20:44 4831canvas坐标 欢迎大家有好点建议可以提。js高级扣扣 ... -
ajax.js
2014-11-20 21:38 1107如果你是 javascript高手,请来这里吧 ... -
html5 规范中新增的api
2014-11-20 21:36 4842如果你是 javascript高手,请来这里吧,扣扣群 1 ... -
被Arguments对象坑了。
2014-11-14 20:47 936当判断一个对象是否是Arguments对象时,我们会这么写 ... -
input onpaste事件
2014-11-12 14:08 10381function afterPaste() { ... -
javascript正则表达式学习——顺序肯定环视,顺序否定环视
2014-11-02 00:43 4677//举例说明。 //经常看到有人为了给数字加千分号(,) ... -
javascript小工具之——cookie操作
2014-11-01 20:28 1249var docCookies = { getItem: ... -
javascript本地缓存之localStorage,sessionStorage等
2014-10-28 11:00 2301如果你是 javascript高手,请来这里吧,扣 ... -
javascript本地缓存之userData(ie专用)
2014-10-27 23:28 919/** *storage 对象 */ functi ... -
javascript 排序,分组小工具 - 支持JSON数组 原生数组(学习,持续更新)
2014-10-24 10:38 6109/** * @author wsf 数据分组,排序js ... -
javascript 计算两日期之间的天数
2014-10-17 10:42 1057var d1 = new Date('2013-01-01' ... -
web版2048小游戏 --- 学习用
2014-09-16 15:18 929web版2048小游戏 --- 学习用 -
javascript 汉字转拼音
2014-09-16 12:57 3075<html> <head> ... -
javascript 将HTML转为 word,pdf 等(ie)
2014-08-18 12:26 3740/** * @author wsf html转换工具 ... -
java HTML2PDF HTML2DOC THML2Image 后台屏幕截图
2014-08-15 11:22 1314网上找的,下载学习吧。
相关推荐
LibGDX JSON是一个在LibGDX游戏开发框架中用于处理JSON(JavaScript Object Notation)数据的库。JSON是一种轻量级的数据交换格式,被广泛应用于网络通信和数据存储,因为它易于阅读和编写,同时也容易让机器解析和...
4. **函数**:自定义函数使用`function`关键字,内置函数如`strlen()`用于获取字符串长度,`count()`用于计算数组元素数量。 5. **数组处理**:PHP支持索引数组和关联数组,常用数组函数有`array_push()`、`array_...
这里定义了一个私有的静态常量`LL`,使用`final`关键字表示其值一旦初始化后就不能更改。该字符串包含了版权信息。 #### 方法定义 ```java public String getSerial(String userId, String licenseNum) { // ... }...
这里澄清了一个常见的误解,即加密前的数据被称为明文,加密后的数据被称为密文,而将明文转换为密文的过程称为加密,而非解密。 ### 5. 内存和外存的区别 - **知识点**: 题目指出了一种错误的说法:“和内存储器...
- **用途**:从编辑器中获取相关的关键字。 - **参数**:无 - **示例用法**: ```javascript var keywords = relatekw(); ``` ##### 2.17 edit_insert - 向编辑器插入代码 **位置**:/uchome/image/editor/...
这些操作符主要用于处理整型数据的二进制位,可以用于数据加密、解密或者实现某些特殊的算法需求。 - **条件操作符**: - `&&`:逻辑与运算符。只有当两边的操作数都为true时,整个表达式的结果才是true。 - `||`...
- **JavaScript**:通过XMLHttpRequest对象发起异步请求。 - **用途**:提高用户体验,减少服务器负担。 ##### JSP9大隐视对象中四个作用域的大小与作用范围 - **page**:当前页面范围内有效。 - **request**:...