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难道不是一个集合吗?

  • 相关阅读:
    B.Icebound and Sequence
    Educational Codeforces Round 65 (Rated for Div. 2) D. Bicolored RBS
    Educational Codeforces Round 65 (Rated for Div. 2) C. News Distribution
    Educational Codeforces Round 65 (Rated for Div. 2) B. Lost Numbers
    Educational Codeforces Round 65 (Rated for Div. 2) A. Telephone Number
    Codeforces Round #561 (Div. 2) C. A Tale of Two Lands
    Codeforces Round #561 (Div. 2) B. All the Vowels Please
    Codeforces Round #561 (Div. 2) A. Silent Classroom
    HDU-2119-Matrix(最大匹配)
    读书的感想!
  • 原文地址:https://www.cnblogs.com/ooooevan/p/6014169.html
Copyright © 2011-2022 走看看