`
zhuozuoying
  • 浏览: 135622 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

JS的Object漫想:从现象到“本质”

    博客分类:
  • JS
阅读更多

前言

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

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

分享到:
评论

相关推荐

    JavaScript快速查询手册

    随着技术的发展,JavaScript也逐渐延伸到服务器端开发(如Node.js)、移动应用开发、桌面应用开发等多个领域。 **基础语法** JavaScript的基础语法包括变量声明(var、let、const),数据类型(Number、String、...

    javascript API 中文离线手册(chm版)

    - 继承:JavaScript采用原型链实现继承,可以使用Object.create()或通过构造函数实现。 - 类(ES6新增):ES6引入了类的概念,但其实质仍是基于原型的继承。 3. **数组和字符串操作**: - 数组方法:如push、pop...

    悟透 javascript

    这是一种更加超脱的观点,强调事物的本质而非表面现象。 #### JavaScript的简化之道 JavaScript是一种将数据和代码简化至最原始形态的语言,它通过对数据类型的精简和对代码表达方式的统一,实现了一种回归简单的...

    JavaScript面向对象的支持

    JavaScript的函数可以访问其自身、其父作用域以及全局作用域的变量,形成了闭包现象。闭包允许函数访问和修改外部环境的状态,为实现私有变量和模拟类的封装提供了可能。 6. **原型扩展与自定义**: 通过`Object....

    JavaScript语言精粹pdf权威指南 中文版

    以上只是《JavaScript语言精粹》一书中涉及的部分关键知识点,全书内容涵盖了从基础到高级的广泛主题,是JavaScript开发者不可或缺的参考书目。通过深入学习,开发者能更好地理解这门语言,写出高效、可维护的代码。

    javascript基础教程

    2. 数据类型:JavaScript是弱类型语言,有七种基本数据类型:Undefined、Null、Boolean、Number、BigInt、String和Symbol,以及一种复杂数据类型——Object。 3. 运算符:包括算术运算符(+、-、*、/等)、比较...

    JavaScript语言精粹_修订版

    JavaScript,作为全球最广泛使用的编程语言之一,是创建交互式网页和网络应用的关键工具。《JavaScript语言精粹_修订版》这本书深入浅出地探讨了JavaScript的核心概念和技术,旨在帮助开发者掌握这门语言的精髓。...

    JavaScript参考手册

    13. **闭包**:JavaScript 中,函数可以访问并操作其词法作用域内的变量,即使该函数在其外部定义,这种现象称为闭包,常用于封装和数据隐藏。 14. **作用域**:JavaScript 有全局作用域、函数作用域和块级作用域。...

    js-ghost-stories:JavaScript鬼故事

    让我们深入探讨一些JavaScript中的“鬼故事”,了解它们的本质,并学习如何避免或解决这些问题。 1. **变量提升(Hoisting)** 在JavaScript中,变量和函数声明会被提升到它们所在作用域的顶部。这意味着即使在...

    JavaScript_Notes:关于不同 JavaScript 概念的注意事项

    CommonJS(Node.js)和ES6模块(import/export)是两种常见的JavaScript模块系统。CommonJS通过`require`导入模块,`module.exports`或`exports`导出模块;ES6模块使用`import`和`export`关键字。 七、错误处理 ...

    Js-The-Right-Way-CN:Js-The-Right-Way中文版

    JavaScript,简称JS,是Web开发中的核心语言,用于创建交互式的网页和应用程序。"Js-The-Right-Way-CN"是一个中文版的指南,旨在帮助开发者按照最佳实践来编写JavaScript代码,提升代码质量和可维护性。它已经被合并...

    JavaScript 函数的执行过程

    JavaScript函数的执行过程是JavaScript语言中的核心概念,它涉及到作用域、作用域链、执行上下文和变量对象等多个重要组成部分。下面将详细解释这个过程。 首先,每一个JavaScript函数本质上都是Function对象的一个...

    es6语法汇总、简单好学,好记

    - **变量提升**:var声明的变量会被提升到其所在作用域的顶部,而let不会被提升,这是一种叫做"暂时性死区"的现象。 - **重复声明**:var可以在同一作用域内重复声明,但let不允许在同一作用域内重复声明变量。 -...

    firefox下jquery ajax返回object XMLDocument处理方法

    然而,如果浏览器接收到这些数据后错误地将其视为XML格式,那么在JavaScript中处理这些数据时,就会遇到[object XMLDocument]的问题。 要解决这个问题,关键在于确保服务器在返回JSON数据时,HTTP响应的头信息中...

    javascript中Function类型详解

    首先,JavaScript中的Function类型是一个对象,也即引用类型,这表明它与JavaScript的基本类型如数字、字符串等有本质上的不同。它是独立于Object类型的一个特殊类型。当你使用typeof操作符检查函数时,返回值为...

    TA-JS-objects-in-details-TJaaam

    深入理解JavaScript对象对于任何想要精通这门语言的人来说都是必要的。在这个资源“TA-JS-objects-in-details-TJaaam”中,我们将详细探讨JavaScript对象的各个方面,帮助你深化对这个主题的理解。 一、对象的本质 ...

    荣誉

    1. **基础语法**:JavaScript的基础包括变量(var、let、const)、数据类型(Number、String、Boolean、Null、Undefined、Object、Symbol、BigInt)、操作符(算术、比较、逻辑、三元)、流程控制(条件语句、循环...

Global site tag (gtag.js) - Google Analytics