返回列表

Javascript的值,对象,原型2

默认分类 2011-01-24 03:22:52

javascript中Function 与Object的关系

悬赏:15 发布时间:2009-03-19 提问人:assjjwz147 (初级程序员)

JavaScript中的Object到底是什么呢?, 
刚开始我认为Object是js的所有对象的原型。 
但是:alert(Object.constructor)显示function Function... 
这说明Object的原型是Function? 
但是问题又来了: 
Function.prototype.read=function(){};//扩展Function的原型 
for(var i in Object)alert(i)//显示read,这进一步证实了Object的原型是Function 

Object.prototype.read=function(){};//扩展Object的原型 
for(var i in Function)alert(i)//显示read,Function的原型是Object???? 
Object到底是什么?做为类的Object与Function是一回事? 


该问题已经关闭: 超过15天由系统自动关闭,悬赏平分给所有参与回答的会员

问题答案可能在这里 → 寻找更多解答

回答

Function类 

ECMAScript最令人感兴趣的可能莫过于函数实际上是功能完整的对象。Function类可以表示开发者定义的任何函数 

所有函数都应看作是Function类的实例 

Function属于Object。 

JavaScript是OOP语言,当然,一切都是对象。 playfish (架构师) 2009-03-19

对于这个问题,建议你阅读一下JavaScript高级程序设计,或许会给你一个很详细的答案: 

引用
ECMA-262把对象(object)定义为“属性的无序集合,每个属性存放一个原始值、对象或函数”。严格说来,这意味着对象是无特定顺序的值的数组。尽管ECMAScript如此定义对象,但它更通用的定义是基于代码的名词(人、地点或事物)表示。 

每个对象都由类定义,可以把类看作对象的配方。类不仅要定义对象的接口(interface)(开发者访问的属性和方法),还要定义对象的内部工作(使属性和方法发挥作用的代码)。编译器和解释程序都根据类的说明构建对象。 

程序使用类创建对象时,生成的对象叫做类的实例(instance)。对类生成的对象的个数的唯一限制来自于运行代码的机器的物理内存。每个实例的行为相同,但实例处理一组独立的数据。由类创建对象实例的过程叫做实例化(instantiation)。 

如第2章所述,ECMAScript并没有正式的类。相反,ECMA-262把对象定义描述为对象的配方。这是ECMAScript的一种逻辑上的折中方案,因为对象定义实际上是对象自身(稍后将对此进行解释)。即使类并不真正存在,本书也把对象定义叫做类,因为大多数开发者对此术语更熟悉,而且从功能上说,两者等价。 

对象定义存放在一个函数——构造函数中。构造函数不是一种特殊函数,它只不过是用于创建对象的常规函数。在本章后面的小节将介绍如何创建自己的构造函数。 


引用 在ECMAScript中,对象由特性(attribute)构成,特性可以是原始值,也可以是引用值。如果特性存放的是函数,它将被看作对象的方法(method),否则该特性被看作属性(property)。

这是JavaScript高级程序设计的样章阅读: 
http://book.csdn.net/bookfiles/110/1001103133.shtml playfish (架构师) 2009-03-19
我也一直有lz的疑问,ls两位的回答好像和lz问的问题不搭介吧? 
今天我试了一下, 
Js代码 
  1. Object.prototype.name = "xx";  
  2.                   
  3.                 for(var prop1 in Object){  
  4.                     alert(prop1);  
  5.                 }  
  6.                 for(var prop3 in Function){  
  7.                     alert(prop3);  
  8.                 }  

这样的情况下,ie,ff,chrome下的结果分别是,ie下:两个循环都aler出了name,ff下:两个循环都没有alert,chrome下:两个循环都alert出了name。 

Js代码 
  1. Function.prototype.name = "xx";  
  2.                   
  3.                 for(var prop1 in Object){  
  4.                     alert(prop1);  
  5.                 }  
  6.                 for(var prop3 in Function){  
  7.                     alert(prop3);  
  8.                 }  

而当在这样的情况下,ie下还是两个都alert出了name,ff下还是没有alert,chrome下也是没有任何alert, 

我也有点疑惑,到底Object是由Function构造出来的呢,还是Function是由Object对象构造出来的,一般好像都说是后者,但是也看见论坛里的一位高手以前的帖子里这样说的 引用 原来Object是由系统自Function 创建的.怎么证明呢? 

Js代码 
  1. alert(Object);//Object()     
  2. delete Object;//true     
  3. Object;//ReferenceError: Object is not defined  
但是你不能delete Function. 

Function就是一切 

帖子在这里:http://www.javaeye.com/topic/206218 
呵呵,有点迷糊,我等下再研究下,如果你理解了就也在这给咋讲下把,(*^__^*) fantasybei (中级程序员) 2009-03-21
Object是一个对象,但是其内部也有方法,也有属性。因此是通过Function来实现的。 

只不过js内部提供了几个基本对象,比如String,Number等等。而Object是这些基本对象的基类。不知道你是否明白了。 

我个人感觉js都是通过function来创建对象的。因此会有你上面的 
原来Object是由系统自Function 创建的.怎么证明呢? 

Js代码 

1. alert(Object);//Object()     
2. delete Object;//true     
3. Object;//ReferenceError: Object is not defined  

alert(Object);//Object()   
delete Object;//true   
Object;//ReferenceError: Object is not defined 

但是你不能delete Function.Function就是一切 
hanjs (初级程序员) 2009-03-30
Js中function 和 object根本就是二样东西。 
你可以这样理解object是一样东西。而function是一个value。 
function可以赋给任何object。 
而function中也可以放置任何object。 
回答你的问题 
1.typeof Object.constructor 是function 
没错 object都有三个methods和属性,constructor ,toString(),valueOf() 
constructor是唯一返回function的。不是说object的原型是function,是它的一个属性可以返回可以叫function的值,当然这个值是可以变的。 

2. 
Function.prototype.read=function(){};//扩展Function的原型 
for(var i in Object)alert(i)//显示read,这进一步证实了Object的原型是Function 
显示没错,回到我最初的conclusion: 
你可以这样理解object是一样东西。而function是一个value。 
function可以赋给任何object。 
而function中也可以放置任何object。 

我的解释你可能无法理解,我也是搞java多年后研究js的,和java绝对不一样。看这本书吧,绝对能解释你的问题。不过是e文的,个人认为是最好的一部js oop书。 
http://erichua.javaeye.com/blog/354569