论坛首页 Web前端技术论坛

JavaScript 对象性的构造分析 - 从现象到本质

浏览 25164 次
该帖已经被评为精华帖
作者 正文
   发表时间:2008-06-25  
我滴神啊 你以为函数返回值相同就叫等价?
你说的实在太远了我才把ECMA262搬出来解释解释免得误导新人
你要非说没错我也没办法

反正我这人别人说点什么总插一杠子说不对确实挺烦人(我自己也这么觉得 哈哈) 不过有我搅和一下 可能有些人再看这东西的时候会稍微自己思考一下吧 毕竟这帖子挂着个精华的招牌呢 我挺怕看一片叫好的帖子的 有些东西我要不说 说不定真就没人说了

那么 目的已经达到了 我也不会再参与这个讨论了

最后感慨一句 JS这个貌似可爱的脚本咬起人来其实挺疼的
0 请登录后投票
   发表时间:2008-06-25  
本质这个东西,语言的创造者最有话语权。
lz的探索精神值得称赞,但结论还是参考标准吧。
1 请登录后投票
   发表时间:2008-07-04  
csf177 写道
- -!这样也可以靠上 你明明连词法关系都没搞对...... 人家new跟函数调用是两种表达式 只不过是长得很像 都带括号而已
算了不说了 能看懂ECMA262的人太少了 明明就那么几行英文 真无奈

设计一个貌似可爱的脚本能让一大半的使用者都看不懂标准文档 该说Brendan Eich水平高还是说他悲哀? 或者,二者兼有......


ECMA262规范不是BE大人写出来的,而是委员会产物。他只不过review过。如果要说BE写出来的,那当然是JavaScript的Referenece和Guide。

当然规范写成这样诘屈聱牙,BE同志自然不能完全脱离干系。但是其中内情,怕是只有委员会的当事人知道。
0 请登录后投票
   发表时间:2008-07-04  
BTW,楼主精神可嘉,希望你好好读Spec,天天向上。
0 请登录后投票
   发表时间:2008-07-04  

确实楼主的研究方法有问题.

你在IE和FF下分别试试这样的写法

function f(){return 'f';}
var vf=function() {return 'vf';}

try{
var f1=new Function(f);
if(f1) alert(f1.toString());
}catch(e){
 alert('can not new Function(f)');
}

try{
var f2=new Function(vf);
if(f2)
 alert(f2.toString());
}catch(e){
 alert('can not new Function(f)');
}

 至于标准怎么说我没有仔细看过,反正浏览器实现是不同的.

0 请登录后投票
   发表时间:2008-07-04  
hax 写道
csf177 写道
- -!这样也可以靠上 你明明连词法关系都没搞对...... 人家new跟函数调用是两种表达式 只不过是长得很像 都带括号而已
算了不说了 能看懂ECMA262的人太少了 明明就那么几行英文 真无奈

设计一个貌似可爱的脚本能让一大半的使用者都看不懂标准文档 该说Brendan Eich水平高还是说他悲哀? 或者,二者兼有......


ECMA262规范不是BE大人写出来的,而是委员会产物。他只不过review过。如果要说BE写出来的,那当然是JavaScript的Referenece和Guide。

当然规范写成这样诘屈聱牙,BE同志自然不能完全脱离干系。但是其中内情,怕是只有委员会的当事人知道。

BE大人设计的比较精妙 所以语言比较难懂 跟规范写的如何没有关系
规范写的没什么问题 哪个语言标准都这样 该看不懂全都看不懂
0 请登录后投票
   发表时间:2008-07-10  
刚刚看到这个问题就看到这个帖子,f() 和 new f()

我作的小实验
function car(){
    this.name="toyota";
}
car.prototype.say=function(){
      alert(this.name);
}
1.car.say() 报"此对象不支持方法"
2.car().say() 报"undefined"为空
3.new car().say() 正确

我想请教1,2为什么错,为什么错的不一样?

谢谢!

还有
function car(){
var cc=this;
this.name="toyota";
this.say=function(){
   alert(this.name);
}
return cc;
}
var c=car();
c.say();
这样可以但用prototype就报错了,为什么呢?
0 请登录后投票
   发表时间:2008-07-10  
terrynoya 写道

function car(){
    this.name="toyota";
}
car.prototype.say=function(){
      alert(this.name);
}

1.car.say() 报"此对象不支持方法"
2.car().say() 报"undefined"为空
3.new car().say() 正确

1>.car.prototype.say=function....说明say()这个方法是只有car这个"类"所产生的对象所有的方法.并不是car这个函数的方法.Ps:"函数"和"类"是同一样东东.
在car.say=function...中.say()才是car的方法.

2>.car().say()这样使用.实际上是调用了car()这个函数.而这个函数没有返回值,未返回任何东西.所以当.say()时,会报undefined为空.

3>.参照第一条,通过new car()就产生了一个car"类"的对象.自然就可以使用say()方法了.

terrynoya 写道

function car(){
	var cc=this;
	this.name="toyota";
	this.say=function(){
	   alert(this.name);
	}
	return cc;
}
var c=car();
c.say();

这样可以但用prototype就报错了,为什么呢?

这句话问的是什么意思..?我有点没搞懂哦.
0 请登录后投票
   发表时间:2008-07-10  
ham 写道
terrynoya 写道

function car(){
    this.name="toyota";
}
car.prototype.say=function(){
      alert(this.name);
}

1.car.say() 报"此对象不支持方法"
2.car().say() 报"undefined"为空
3.new car().say() 正确

1>.car.prototype.say=function....说明say()这个方法是只有car这个"类"所产生的对象所有的方法.并不是car的方法.
在car.say=function...中.say()才是car的方法.

2>.car().say()这样使用.实际上是调用了car()这个函数.而这个函数没有返回值,未返回任何东西.所以当.say()时,会报undefined为空.

3>.参照第一条,通过new car()就产生了一个car"类"的对象.自然就可以使用say()方法了.

terrynoya 写道

function car(){
	var cc=this;
	this.name="toyota";
	this.say=function(){
	   alert(this.name);
	}
	return cc;
}
var c=car();
c.say();

这样可以但用prototype就报错了,为什么呢?

这句话问的是什么意思..?我有点没搞懂哦.


感谢ham的回答,函数这种2位一体很能让我这种新手弄不清方向。。呵呵
0 请登录后投票
   发表时间:2009-02-05  
谢谢楼主花这么大的精力来做如此深入的研究.

再次感谢.
0 请登录后投票
论坛首页 Web前端技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics