function outer(){
function inner(){}
return inner;
} var a=outer();
var b=outer();
var c=new outer();
var d=new outer();

问题:这些的值都是什么?

a==b;
a.constructor==b.constructor;
b.constructor==c.constructor;
a.prototype.constructor;
b.prototype.constructor==c.prototype.constructor;

答案: false;true;true;function inner(){};false;

解析:知识点为函数调用的返回值,new 构造器的实例对象,原型,construcor构造器指向等。

  • var a=outer();var b=outer(); 调用了outer函数并执行,outer函数返回了对inner函数的引用,这个引用保存在a,b变量中。误区在于我曾经以为返回的是同一个引用以为a,b指向内存中的同一个inner。实际是两个不同的引用,虽然他们的内容都相同,可以这么理解,a保存的引用指向复制了一份inner的内存区域,b保存的引用指向另一份复制inner的内存区域
  • 由于调用执行outer后返回的是一个对于函数的引用,我们知道所有函数的constructor属性都指向function Function() { [native code] }这个总的构造器,所以a.constructor==b.constructor;指向的就是同一个Function,当然为true啦。
  • var c=new outer();var d=new outer();看似是用new构造函数形式返回实例对象,而执行构造函数outer的时候执行有return语句,这似乎不多见,常见的返回值就是此构造函数的实例化对象。但是js大法牛逼啊,js的构造函数可以有返回值也可以没有(分为三种情况:没有返回值则返回实例化对象;若有返回值检查其返回值是否有引用类型,如果为非引用类型比如基本类型时就无视,还是返回其实例化对象;若返回值为引用类型,比如return {}对象,比如return fun函数等,则实际返回值为这个引用类型。(参考自:http://www.cnblogs.com/xxcanghai/p/5189353.html#3361101)。这里c,d均保存返回的引用,指向自己inner函数对象,所以c.constructor也是指向Function的,b.constructor==c.constructor;就为true啦。
  • a现在指向内存区域中某块地方,类型是函数,函数内容和inner函数内容一样,既然是函数那这个函数就有自己的prototype原型属性,而a.prototype原型属性又有constructor属性,该constructor属性又指向拥有prototype的函数,就是这里a指向的函数。
  • b同理,b.prototype.constructor指向b指向的函数,c.prototype.constructor;c本身也指向函数,所以也同理c.prototype.constructor也指向c指向的函数。

虽然看起来constructor看起来一样,其实是不一样的!

关于作用域的一点说明:a,b,c,d都有自己的作用域链,然后延伸到全局环境的。

javascript构造函数小记的更多相关文章

  1. JavaScript 构造函数

    关于JavaScript构造函数,如今出现了很多JavaScript的框架,例如jQuery.Ext等等这些,这些将JavaScript作为一种面向对象的语言进行编程,那么JavaScript到底是怎 ...

  2. javascript 构造函数方式定义对象 (转载)

    javascript 构造函数方式定义对象   javascript是动态语言,可以在运行时给对象添加属性,也可以给对象删除(delete)属性 <html> <head> & ...

  3. Javascript 构造函数、原型对象、实例之间的关系

    # Javascript 构造函数.原型对象.实例之间的关系 # 创建对象的方式 # 1.new object() 缺点:创建多个对象困难 var hero = new Object(); // 空对 ...

  4. Javascript 构造函数原型继承机制

    我们先聊聊Js的历史,1994年Netscape公司发布了Navigator浏览器0.9班.这是历史上第一个比较成熟的网络浏览器.轰动一时.但是,这个版本的浏览器只能用来浏览,不具备交互功能,最主要的 ...

  5. JavaScript构造函数学习笔记

    1 理解Javascript constructor实现原理 在 JavaScript 中,每个函数都有名为“prototype”的属性,用于引用原型对象.此原型对象又有名为“constructor” ...

  6. Javascript构造函数与prototype

    构造函数 构造函数的缺点 prototype的引入 Prototype模式的验证方法 构造函数 在Javascript语言中,new命令后面跟的不是类,而是构造函数(constructor). 构造函 ...

  7. JavaScript正则表达式小记

    RegExp.html div.oembedall-githubrepos{border:1px solid #DDD;border-radius:4px;list-style-type:none;m ...

  8. javascript 构造函数方式定义对象

    javascript是动态语言,可以在运行时给对象添加属性,也可以给对象删除(delete)属性 <html> <head> <script type="tex ...

  9. javascript学习小记(一)

    大四了,课少了许多,突然之间就不知道学什么啦.整天在宿舍混着日子,很想学习就是感觉没有一点头绪,昨天看了电影激战.这种纠结的情绪让我都有点喘不上气啦!一点要找点事情干了,所以决定找个东西开始学习.那就 ...

随机推荐

  1. vs2013 设置为中文版

  2. 【JavsScript】XMLHttpRequest Level 2 使用指南

    XMLHttpRequest是一个浏览器接口,使得Javascript可以进行HTTP(S)通信. 最早,微软在IE 5引进了这个接口.因为它太有用,其他浏览器也模仿部署了,ajax操作因此得以诞生. ...

  3. Autolayout环境设置任意个数相等间距排列的按钮的方法

    摘要: 在storyboard中,想要用autolayout设置多个按钮按照相同的间距排列,并且自动根据屏幕宽度调整间距大小,就我了解的来说,没有直接的设置方法.我用storyboard+代码的方法实 ...

  4. iOS开发——多线程OC篇&多线程详解

    多线程详解 前面介绍了多线程的各种方式及其使用,这里补一点关于多线程的概念及相关技巧与使用,相信前面不懂的地方看了这里之后你就对多线程基本上没有什么问题了! 1——首先ios开发多线程中必须了解的概念 ...

  5. HTML+CSS+JS基础知识

    HTML+CSS+JS基础知识 目录 对HTML+CSS+JS的理解 基础知识 对HTML+CSS+JS的理解 基础知识 插入样式表的三种方式 外部样式表:<link rel="sty ...

  6. cocos2d-x在android下的编译

    $(call import-add-path,E:/cocos2d-2.0-x-2.0.3) include $(BUILD_SHARED_LIBRARY) http://www.cnblogs.co ...

  7. IE9-10 option BUG

    IE 9-10下如果option元素没有定义value而在设置innerText时没有把两边的空白去掉,那么 取el.text,浏览器会进行trim, 并且伪造一个value值,此值会在刚才trim的 ...

  8. structs 2 学习总结(一)

      转发请注明出处 1.页面传值. 传值 前台 <s:form action="login1">//action 名字 需要在structs配置 用户<s:tex ...

  9. 02.Java多线程并发库API使用

    1.        传统线程技术回顾 继承线程与实现Runnable的差异?为什么那么多人都采取第二种方式? 因为第二种方式更符合面向对象的思维方式.创建一个线程,线程要运行代码,而运行的代码都封装到 ...

  10. 【MongoDB】使用mongo连接服务器。。。

    使用mongo连接服务器 命令行: ./mongo 主机号:端口号/数据库名 e.g. ./mongo 127.0.0.1:12345/mongodb1 关闭服务器 use admin db.shut ...