忽然间茫然之javascript函数和对象

大家不要笑话我 前天晚上睡觉时候忽然想到这个问题 javascript对象是由函数构造的 可是我感觉貌似用函数就够了 使用对象就是为了多个继承吗 我发现自己很多时候用函数就够了 到底什么时候是必须用函数的呢

唉 脑子很乱 这样写也不知道大家看的懂我的意思不···

[quote]蔡老师说:“至于Object与Function的区别,感觉最大的还是在于原型”
我的理解是
Object和Function的原型都是挂接在Function.prototype上,挂在同一原型上没有区别。

对象和函数才是有区别的!
var obj = new Object();//对象
obj的原型是挂在Object.prototype上
var fn = new Function("参数","//code");
fn的原型是挂在Function.prototype上

应该是:
fn 和obj有区别因为原型不同(Object.prototype 与 Function.prototype有区别)[/quote]

话说是Object与Function的区别,其实真正说的是其实例的区别。
Object与Function本身是没什么区别的,其两者都既是函数又是对象。
Object instanceof Function => true
Function instanceof Object => true
我认为两者的区别在于Object.prototype产生的是{},而Function.prototype产生的是function(){}。所以我赞成你的那句话。

其实质还是在于{}与function(){}不同。主要因为{}不是一个Function,所以也没有prototype。通常可以看成一个简单的数据集合。如:
{} instanceof Object => true
(function(){}) instanceof Object => true
{} instanceof Function => false
(function(){}) instanceof Function => true

由上可以看出,Object实例{}并不是一个Function。因为Function有个很大的特色就是原型链,所以Object实例并没有继承这个特色。
var a = {};
var b = function(){};
var c = new a(); //Error
var d = new b();
var e = a.prototype; //undefined
var f = b.prototype; //Object

因此,{}与function(){}的区别在于function(){}可以看做一个Function对象,用来生成新的实例,而{}不能。所以上例中var c = new a();会抛出错误。

略懂略懂~

貌似用右手就可以了,找个老婆就是为了释放右手吗?我发现很多时候使用右手就可以了,到底什么时候是必须用右手的呢

如果你仅仅是指
function(){}
的定义方法。
那么使用Object定义方式也行的,基本上没区别,不用钻牛角尖。

至于Object与Function的区别,感觉最大的还是在于原型

函数主要是完成一些功能,声明一个对象传递参数更方便。声明对象的方法可以区别同名函数。

javascript对象是由函数构造的
还有一句话是:
javascript的函数也是由函数构造的

var Object = new Function("","[native]code");//这个是构造过程
另外补充一点:由Function构造函数构造出来的对象可以用new关键字继续创建对象

所以上面创建的对象其实就是:
function Object(){
//[native]code
}

然后我们new Object就创建出了对象。

最后说下个人理解:
javascript对象和函数 都是由 Function函数构造出来的。

感觉直接写函数的话,相对于对象少了些对象特有的属性,二用new来声明就可以使用这些属性,还有上面说到的原型,在js里也很重要。

蔡老师说:“至于Object与Function的区别,感觉最大的还是在于原型”
我的理解是
Object和Function的原型都是挂接在Function.prototype上,挂在同一原型上没有区别。

对象和函数才是有区别的!
var obj = new Object();//对象
obj的原型是挂在Object.prototype上
var fn = new Function("参数","//code");
fn的原型是挂在Function.prototype上

应该是:
fn 和obj有区别因为原型不同(Object.prototype 与 Function.prototype有区别)

当程序的复杂度是你倍感苦恼,当你想追求简单时,就可以考虑使用对象了。

这个时期,一般都有过,很多人由于工作原因(用不到),没有继续走下去。希望楼主可以继续深入的研究下去。建议你读一下《悟透JavaScript》。可以提高你的JavaScript的段位。
这篇文章读完以后,就是要实践了,在你接触的系统中,如何巧妙的运用JavaScript是就需要你一点点的积累和总结了。希望楼组精益求精。

面向对象而不是过程~

javaeye为什么时常不能正常访问呢?到底是为什么?谁能告诉我啊?

看你封装的程度了,方法级别的就函数级别就够了,当你想封装组件级别的面向对象更能体现整体。

把这个认真的看完就明白了:
http://www.iteye.com/topic/155109

首先,从概念上理解吧....
对象--->有属性有执行体(函数);
函数--->可以理解为一个单一的执行过程;

javaScript 个人认为语法相当的灵活.虽然可以通过函数去构造对象,但是完全使用函数有其局限性;

比如说:
你去描述一个人的时候
var person = {};
person.age = 20;
person.sex = "f";
person.fire = function(/***/){};
........

然后你就可以直接调用.....如果你用函数的话也完全可以实现,但是麻烦的很多吧???

我的理解:
1.javascript本身是个函数式语言,所以只写函数也ok。
2.javascript也有对象,不说具体,举个例子window本身就是对象。
3.所有的javascript变量可以声明为var xx = zz。这样的形式,可以不放在函数里面,那么它本质上是被定义到了window.xx作为全局属性。所以本质上还是对象。
4.比较重要的一点是,javascript可以采用对象形式。那么你会不会选择用呢?

如果你只是界面的简单的显示逻辑,那用它不会有什么好处的。

那假如你写过几千行或者上万行的js来表达一个很富有逻辑的代码段。你会使用函数,你要用多少个函数,多少个全局变量来保存多少种信息,你觉得你写出的那成千上百的函数和变量,最后你自己还清楚吗。
用辩证法角度来看,什么都有好有坏,择其优而用。

我的理解:
1.函数只包含操作,比如要做什么处理,可以写个函数。
2.对象是包含数据的,比如json数据,就是对象的形式。

应该是两个不同的东西吧,如果要把数据以函数的形式写,那估计也别扭。

哇塞,居然有蔡老师的留言^_^,增加了我学js的动力

Object instanceof Function => true
Function instanceof Object => true
这个写法曾经困扰我很久

instanceof 是如何判断的呢?

假设 obj = new fn;
那么 obj instanceof fn //ture;

最初我一直认为instanceof是这样判断的
obj.constructor ===fn 所以true

后来我发现是这样的!
找到obj的内置原型,用它和构造函数的原型进行比较(obj._proto_==fn.prototype)
如果发现不匹配 就在原型中找上一级原型(fn.prototype._proto_)
如果还找不到 就继续找上一级原型(fn.prototype._proto_._proto_)

原理说了,接下来再看
Object instanceof Function => true //这个很好理解
Object = new Function("","");//Object是由Function构造出来的
Object._proto_ === Function.prototype //ture

关键是这个
Function instanceof Object => true
先判断Function._proto_ == Object.prototype 发现不匹配
于是Function._proto_ == Object.prototype._proto_ //ture;

不知道我有没有表达清楚>_<

[quote]关键是这个
Function instanceof Object => true
先判断Function._proto_ == Object.prototype 发现不匹配
于是Function._proto_ == Object.prototype._proto_ //ture; [/quote]

你说反了
Function instanceof Object的依据不是
Function._proto_ == Object.prototype._proto_
而是
Function.prototype._proto_ == Object._proto_

看了你的疑惑后,我认为,你不明白的是为什么要使用对象,而不是JavaScript实现对象的方法。

也就是说,你的思想里还没有面向对象设计的思想,而是在用面向过程设计的的思维。这与那种程序语言无关。

要真正解决你的疑惑,你觉得你要学习一些面向对象设计方面的书,去理解面向对象的思想,而不是看其如何实现面向对象的。

不要忘记:万物皆对象。那么函数本身也就是对象。函数对象区别于普通对象的唯一差距就是函数式对象可以执行。

ECMAScript5标准中的bind方法确实可以让你不再用函数构造对象。
比如
[code="js"]

var a = function(x,y){return this.base*(x+y)}
var b = a.bind({base: 3})
b(1,2)
9
[/code]

你的问题:

1、“但是 对象应该是比函数强大的啊 可惜我没体会到~~”

答案是:对象并不比函数强大!

2、“感谢好像是的 我很喜欢我学的第一个语言 C ”

面向对象设计与语言没有关系,有差异的是面向对象设计的语言与面向过程设计的语言。一句话,就是语言的不同。

以上的原因解释:

1、对象往往是一些属性与方法(函数的集合体),二者没有可比性。

2、你注意没有,你常常会看到这样的词语“面向对象设计”,“面向过程设计”,这两个词语真正的共同点,或说其想表达的中心在于“设计”!而“面向对象”和“面向过程”,只是其实现“设计”的方法的不同。既然其目的是“设计”,那你用什么语言来设计,都是可以的。因此,很多人如果没有建立起面向对象设计的思想,那他即使使用面向对象设计的语言去设计系统,他也只是使用面向过程式的思想去设计系统。那么同样的,一个人如果有很强的面向对象设计的思想,那他完全可以用过程式的语言,甚至用汇编语言,同时用面向对象的思想去设计他的系统。

但要阐述清楚面向对象与面向过程的思想,不是这几句话区分得了的。等元旦放假的时候,写篇文章把我的理解写一下。你再看一下吧。

上面写错一句话,应改为:

1、对象往往是一些属性与方法(函数)的集合体,二者没有可比性。

可能你明白面向对象跟面向过程的区别,就会发现他的好处

面向对象的思想

深奥,需要睡觉的时候,人静的时候思考。何时该用对象,何时该用函数。。如果,可以替换,可能还是对js不够了解。

对象是由属性构成的 不是函数
函数方法只是作用在这些属性上
以上的话和语言无关
另外 js不是面向对象的 是基于对象

其实是不同方法的不同表现

:wink:

我的理解是在JS中函数和对象的区别很微弱, 为什么用函数来构建对象, 其原因主要在于:
1. 用函数构建的对象, 可以使用new来创建, 因此我们更习惯接受这种方式创建对象.
[code="javascript"]
var a = {}, b = function(){};
var c = new a();//error
var d = new b();
[/code]
2. 用函数构建的对象, 可以实现私有和公有方法, 这与我们平时认识到的对象特性相符.
[code="javascript"]
var clazz = function(){
var privateMethod = function(){alert('This is a private method');};
this.publicMethod = function(){alert('This is a public method')};
this.invokPrivateMethod = function(){privateMethod();};
};
var instance = new clazz();
instance.publicMethod();//alert'This is a private method'
instance.invokPrivateMethod();//alert'This is a public method'
instance.privateMethod();//error
[/code]
3. 通过对Function的pototype进行改造, 可以加入构造函数, 通过反射实现的继承, 与我们平时理解的继承特性几乎一致.
由于涉及代码较多, 这里没有举例, 如果有兴趣可以参考ExtJs的实现. 在ExtJs中, 继承, 也就是扩展时(Extend), 将方法写在构造函数中(Constructor), 全都是公有的, 如果只是写在继承或者扩展里(Extend), 则仅在此对象内部有效, 即全为私有.
4. 另外通过函数可以实现闭包, 也可以实现代理, 使用{}对象中不行.
因此, 如果仅仅是承载数据, 类似于json的话, 直接使用{}对象, 不然都使用function吧, 优点多多.

读大学的时候,我感觉JS是最难的,等明白了,其实也那样的。熟悉了就好[img]http://javaname.com/test/good2.htm[/img]

JavaScript中函数(function)也是一种数据类型,跟数字(number)、字符串(string)一样,将一个函数实例化,就会产生一个对象(object)类型,这些都可以通过typeof函数还求的当前变量的数据类型。

[code="java"]
function a() {
this.property1 = "circleName";
this.property2 = 2;
function compute (r) {
return 3.14*r*r;
}
this.getArea = function() {
return compute(this.property2);
};
}
var myCircle = new a();
alert(typeof(myCircle.property1));
alert(typeof(myCircle.getArea()));
alert(typeof(myCircle));
alert(typeof(a));
[/code]
上面代码中四个alert分别显示:
number string object function
感觉说的还是比较浅显易懂的。我们可以把JavaScript中函数理解成java中的类,虽然JavaScript不是面向对象的语言,我们也不经常使用它的基于对象的特性,但是JavaScript中的函数还是和java中的类有许多相似之处的,比如都有成员属性(类如a函数中的property1),成员方法(例如a函数中的getArea)。只是我们在实际编程中函数式编程习惯用的多一些,像这种基于对象的编程用的比较少,让我们忽略它的基于对象特性,其实JavaScript稍加改造,也是可以实现面向对象中继承之类的操作的,这些就超出了几天的讨论范围了。

[quote]貌似用右手就可以了,找个老婆就是为了释放右手吗?我发现很多时候使用右手就可以了,到底什么时候是必须用右手的呢
[/quote]
哈哈,经典!