zoukankan      html  css  js  c++  java
  • JS的Object漫想:从现象到“本质”

     转自:http://zzy603.iteye.com/blog/973649

    写的挺好,用于记录,把对象分成概念的Objectvar f={})和 类的Object(function F(){})

    -------------------------------------

    前言

      首先,要说明的我是一个计算机爱好者,但我并不是科班出身,也没有受过专业的培训,所以,有些专业名词可能用的不当或者看法偏激乃至错误,敬请谅解并给予斧正为盼。

    一、Object是什么?

      刚开始我简单地认为Object是js的所有对象的原型(基类)。但我在作测试时发现如下怪现象:

    QUOTE:
    alert(Object.prototype.constructor)


      这条语句显示function Object(){[native code]}。我们知道一个对象的constructor的返回值是创建这个对象的类的构造体,因此根据以上代码的结果,说明Object的原型是Function。这一点可以从下面的两行下面代码得到进一步验证:

    QUOTE:
    Function.prototype.read=function(){};//扩展Function的原型 
      for(var i in Object)alert(i) //显示read,这进一步证实了Object的原型是Function



    QUOTE:
    /*但问题不这么简单,请看下面两行代码:*/ 
      Object.prototype.read=function(){};//扩展Object的原型 
      for(var i in Function)alert(i)//显示read,Function的原型是Object????


      对于Object与Function互相继承对方的prototype属性集,我百思不得其解,就将这四行代码提交给了birdshome,请他解疑。尽管还是没有解决疑问,我还是非常感谢他的回答――给了我极大的鼓励!后来看到网友supersnake 关于这个问题的回复评论,结合前段时间的思考,算是初步理解了一点。现在把我的这点理解写出来,供大家参考:

      1、要想准确理解JS的Object,必须认识到一点:Object首先是一个"概念"、是一个高度抽象的"概念",它并不具有太多的操作意义,但正是由于它的高度抽象性,我们才有必要深入地研究它,只有这样,才能深入地理解JS。

      进一步讲,Object是对JS中所有复合数据类型的高度抽象,代表了JS中具有相应构造体、相对清晰的结构和具有可执行意义的集合体!因此:Function、Array、Date、Number、Boolean、String、Error和RegExp等是object,Object自身是object,自定义类是object,window是object,document是object,Dom对象是object,{}是object......

      总之,JS中的一切复合数据类型都是object,都以Object为原型。因此对Object原型的扩充,Function当然继承,就连Object自身也同样继承:试看下例:
      

    QUOTE:
    Object.prototype.read=function(){};//扩展Object的原型 
      for(var i in Object)alert(i)//显示read


      2、Object既然是JS中的一切复合数据类型的原型,那么它就是一个类,一个基类。在JS中,类都以Function为原型。看下面的例子:

    QUOTE:
    var _test=[Number,Array,Date,Boolean,Error, RegExp,Object];
    for(var i=0;i<_test.length;i++)
    {
    document.writeln(_test[i].prototype.constructor);
    document.write("
    ")
    }


      我们的得的结果是:

    QUOTE:
    function Number() { [native code] } 
    function Array() { [native code] } 
    function Date() { [native code] } 
    function Boolean() { [native code] } 
    function Error() { [native code] } 
    function RegExp() { [native code] } 
    function Object() { [native code] }


      可见JS中的内部类都是Function的子类。因此对Function原型的扩充必然会被Object继承!

      总结语:做为概念的Object和做为类的Object是不同的,前者的外延包含了后者的外延,理解了这一点,就能熟练掌握JS的Object类了。

    二、做为概念的Object的分类:

      1、做为类的Object,如上所述。包括非Build-in Object的Native Object(注)、自定义类等。

      2、做为静态name-value对集合的Object(可能这才是Object的真谛),如

    QUOTE:
    var _collection={
           length : 1,
           item : ["first"],
           insert : function(){}
          }


      它不能被继承、没有prototype子集;不能被实例化,因此它是静态的;它具有集合的演算特征:析取操作符[],删除成员操作符:delete.......

      3、各种类的实例对象,如
        

    QUOTE:
    var myArray=new Array;


      myArray也是Object类型。

      4、Build-in对象。

      5、依赖于宿主环境的Object:DOM、window。对Object原型的扩充不能被"依赖于宿主环境的Object"所继承(注,在mozilla中,会继承名字,但无法执行)。

    三、Object的属性和方法

      1、Object.length :Object构造体的形参数量。Object的构造体有一个可选的参数 ‘value',因此 Object.length= 1,但IE不报告可选参数,所以在IE下,此属性值为0。

      2、Object.name :Mozilla支持,返回"Object"。

      3、Object.prototype 
      4、Object.prototype.constructor 

      5、Object.prototype.eval(source) :eval is supported in Mozilla but not MSIE。

      6、Object.prototype.hasOwnProperty(property) :returns true if property is a local (unshared) property of the instance。

      7、Object.prototype.isEnumerable(property) :returns true if property is enumerated during a for (p in instance) loop,Mozilla and MSIE do not support isEnumerable。

      8、Object.prototype.isPrototypeOf(object) :returns true if the instance is the prototype of object。

      9、Object.prototype.toLocaleString() :returns a localized string representing the instance

      10、Object.prototype.toString() 

      11、Object.prototype.valueOf() 

      12、object.__proto__ :Mozilla支持, points to its prototype object。

      另外,还具有[]、instanceof  和 delete等运算符

      注:
      Native Object: JavaScript语言提供的不依赖于执行宿主的对象,其中一些是内建对象,如:Global、Math;一些是在脚本运行环境中创建来使用的,如:Array、Boolean、Date、Function、Number、Object、RegExp、Error。

        Build-in Object: JavaScript语言自身的内建对象,如:Global、Math; 

        Host Object:宿主环境对象,如:IE中的window、DOM对象等。

    四、下一步的思考

      1、建立继承机制。一般的做法是对Function的原型进行扩充(即在Function的prototype属性集内新建继承函数),但是对Function原型的扩充会被做为类的Object自动继承,也就是说,当javascript引擎初始化自定义类时,会自动去执行一遍扩充的继承函数,并将该函数赋予自定义类,这样效率高吗?
    JS的特征首先是灵活,不是所有的地方都需要继承机制,因此建立一个具有继承函数的Class基类,需要继承机制的就引用这个Class,不需要的就不引用,这样的话效率可能会更高......

      2、Object的集合特性

    QUOTE:
    function person()
    {
    this.name;
    this.age;
    this.setAge=function(_age){this.age=_age;};
    }//建立person自定义类

    person.eat=function(){};
    person.language=["han","english"];

    alert(person["eat"]);//显示function(){}
    alert(person["language"]); //显示han,english


      这个person难道不是一个集合吗?

  • 相关阅读:
    在Bootstrap开发框架基础上增加WebApi+Vue&Element的前端
    使用Vue-TreeSelect组件的时候,用watch变量方式解决弹出编辑对话框界面无法触发更新的问题
    使用Vue-TreeSelect组件实现公司-部门-人员级联下拉列表的处理
    利用查询条件对象,在Asp.net Web API中实现对业务数据的分页查询处理
    利用过滤器Filter和特性Attribute实现对Web API返回结果的封装和统一异常处理
    使用代码生成工具快速开发ABP框架项目
    基于ABP框架的SignalR,使用Winform程序进行功能测试
    使用egg.js开发后端API接口系统
    小样本学习领域的几篇优秀文章解读——都是度量学习
    用于对机器学习模型进行对抗性攻击、防御和基准测试的Python库:CleverHans 3.0.0
  • 原文地址:https://www.cnblogs.com/ooooevan/p/6014169.html
Copyright © 2011-2022 走看看