只转了自己不熟悉的部分

原文(点这里)

0.

JavaScript的所有function类型的对象都有一个prototype属性。这个prototype属性本身又是一个object类型的对象,因此我们也可以给这个prototype对象添加任意的属性和方法。(我理解的prototype属性是这个function作为对象时的对象。。)

1.

 function Sing()    {with(arguments.callee)          alert(author + ":" + poem);    };    Sing.author = "李白";    Sing.poem = "汉家秦地月,流影照明妃。一上玉关道,天涯去不归";    Sing();    Sing.author = "李战";    Sing.poem = "日出汉家天,月落阴山前。女儿琵琶怨,已唱三千年";    Sing();

这里写了在函数内部调用函数的属性。。。

2.

但遗憾的是,我们几乎不能访问到对象内置的原型属性!尽管有些浏览器可以访问到对象的内置原型,但这样做的话就只能限定了用户必须使用那种浏览器。

这也几乎不可行。
那么,我们可不可以通过一个函数对象来做媒介,利用该函数对象的prototype属性来中转这个原型,并用new操作符传递给新建的对象呢?

其实,象这样的代码就可以实现这一目标:

   function anyfunc(){};           //定义一个函数躯壳    anyfunc.prototype = Person;     //将原型对象放到中转站prototype    var BillGates = new anyfunc();  //新建对象的内置原型将是我们期望的原型对象

不过,这个anyfunc函数只是一个躯壳,在使用过这个躯壳之后它就成了多余的东西了,而且这和直接使用构造函数来创建对象也没啥不同,有点不爽。
可是,如果我们将这些代码写成一个通用函数,而那个函数躯壳也就成了函数内的函数,这个内部函数不就可以在外层函数退出作用域后自动消亡吗?

而且,我们可以将原型对象作为通用函数的参数,让通用函数返回创建的对象。我们需要的就是下面这个形式:

function New(aClass, aParams)    //通用创建函数    {function new_()     //定义临时的中转函数壳        {            aClass.Create.apply(this, aParams);   //调用原型中定义的的构造函数,中转构造逻辑及构造参数        };        new_.prototype = aClass;    //准备中转原型对象        return new new_();          //返回建立最终建立的对象    };

var Person =        //定义的类    {        Create: function(name, age)        {this.name = name;this.age = age;        },        SayHello: function()        {            alert("Hello, I'm " + this.name);        },        HowOld: function()        {            alert(this.name + " is " + this.age + " years old.");        }    };

var BillGates = New(Person, ["Bill Gates", 53]);  //调用通用函数创建对象,并以数组形式传递构造参数    BillGates.SayHello();    BillGates.HowOld();

    alert(BillGates.constructor == Object);     //输出:true

这里的通用函数New()就是一个“语法甘露”!这个语法甘露不但中转了原型对象,还中转了构造函数逻辑及构造参数。

有趣的是,每次创建完对象退出New函数作用域时,临时的new_函数对象会被自动释放。由于new_的prototype属性被设置为新的原型对象,其 原来的原型对象和new_之间就已解开了引用链,临时函数及其原来的原型对象都会被正确回收了。上面代码的最后一句证明,新创建的对象的 constructor属性返回的是Object函数。其实新建的对象自己及其原型里没有constructor属性,那返回的只是最顶层原型对象的构造 函数,即Object。

看下面的例子(结合上面第0条阐述)

function Sing()    {

    }

var person={};    //Sing.prototype=person;//去掉注释和不去注释下面的结果不一样var s=new Sing();    alert(s.constructor);

注释后,s的constructor就是sing()函数体,去掉注释后构造函数是Object函数体

转载于:https://www.cnblogs.com/sking7/archive/2012/01/05/2313756.html

(转)悟透javascript相关推荐

  1. 悟透 JavaScript

    为什么80%的码农都做不了架构师?>>>    悟透 JavaScript Posted on 2008-02-25 13:32 李战 引子 编程世界里只存在两种基本元素,一个是数据 ...

  2. 李战:悟透JavaScript 【转】

    多年前,曾经看过李战大师的"悟透delphi-delphi的原子世界",一直对大师特有的文笔风格记忆犹新,今天无意又看到了大师的"李战:悟透JavaScript" ...

  3. 悟透JavaScript(美绘本)

    图书信息 作 者: 阿里软件资深架构师 李战 著 沉鱼 绘 出 版 社: 电子工业出版社 出版时间: 2008-12-1 页 数: 180页 开 本: 16开 I S B N : 9787121074 ...

  4. 悟透JavaScript引子

    悟透JavaScript 引子     编程世界里只存在两种基本元素,一个是数据,一个是代码.编程世界就是在数据和代码千丝万缕的纠缠中呈现出无限的生机和活力. 数据天生就是文静的,总想保持自己固有的本 ...

  5. 悟透Javascript(转载)

    引子 编程世界里只存在两种基本元素,一个是数据,一个是代码.编程世界就是在数据和代码千丝万缕的纠缠中呈现出无限的生机和活力. 数据天生就是文静的,总想保持自己固有的本色:而代码却天生活泼,总想改变这个 ...

  6. 《悟透JavaScript》犹抱琵琶半遮面

    没有千辛万苦,只有快乐无穷,看不见周折曲弯,只有笑声不断-- <悟透JavaScript>已经初步排定,上市日期指日可待·#$$%^&%^&^* 这本书的封面也确定了.大家 ...

  7. 悟透JavaScript 转

    悟透JavaScript Posted on 2008-02-25 13:32 李战 阅读(24340) 评论(229)  编辑 收藏 所属分类: 软件思想 引子     编程世界里只存在两种基本元素 ...

  8. 悟透JavaScript[转]

    转自: http://www.cnblogs.com/leadzen/archive/2008/02/25/1073404.html http://www.cnblogs.com/leadzen/ar ...

  9. 用水云般自在的禅心,书写诗情画意的程序人生--悟透JavaScript

    http://www.cnblogs.com/leadzen/archive/2008/02/25/1073404.html Code 悟透JavaScript  Posted on 2008-02- ...

  10. 悟透JavaScript 1

    编程世界里只存在两种基本元素,一个是数据,一个是代码.编程世界就是在数据和代码千丝万缕的纠缠中呈现出无限的生机和活力. 数据天生就是文静的,总想保持自己固有的本色:而代码却天生活泼,总想改变这个世界. ...

最新文章

  1. std::transform使用
  2. filter[过滤器]使用大全
  3. 数据结构与算法:异或运算
  4. 1.6 Number类
  5. php的类装载的步骤,设计PHP自动类装载功能
  6. 安装SQLserver2008
  7. windows和linux允许分片,请问hadoop的hdfs文件系统和本地windows文件系统或linux文件系统是什么关系啊,谢谢...
  8. AutoScaling 与函数计算结合,赋予更丰富的弹性能力
  9. 为什么微服务化、数据仓库都不是中台?
  10. Linux内核调试debugfs
  11. Java 基础类型int 与 Integer
  12. win7+cuda8.0+cudnn6.0+tensorflow-gpu1.3.0安装过程总结
  13. 在线文本并集计算工具
  14. 推荐四款实用的局域网文件夹同步工具
  15. 计算机是通过计算器发明的吗,计算器是什么时候发明的
  16. 最小生成树——贪心算法
  17. java excel 水印_Java 添加Excel水印
  18. zabbix5.0手把手搭建过程
  19. svn clean up 特别慢
  20. 大数据量查询大杀器之Mybatis 流式查询

热门文章

  1. 插件拓展 - 利用js实现n个元素重新组合
  2. C++ minidump类
  3. 快速排序QuickSort
  4. DbUtils组件的使用小指南
  5. 注册微服务到Eureka Service
  6. python元类_Python中元类
  7. node稳定版本_Node.js十年,你大爷还是你大爷
  8. php 五子棋源联机版_五子棋服务器客户端联机对战 C++版完整代码
  9. TypeScript:函数基础
  10. Vue:embed结合ElementUI中dialog实现PDF文件预览