关于刚才的帖子"new构造器与javascript对象的问题"

foolbirdflyfirst 2011-10-31 06:43:54
LZ结帖有点早,我发现#56楼同学说的没错。
实践如下
var str = function()
{
return "Hello world!";
};
str.prototype = {a:1}
var str2 = function()
{
return new RegExp("Hello world")
}
str2.prototype = {a:1}
var os1 = new str();
alert(os1)//[object Object]
alert(os1.a)//1
var os2 = new str2();
alert(os2);// /Hello world/
alert(os2.a)// undefined!!!外面那个new根本没起作用!

所以我倾向于认为这个是js实现的一个特征,和原本对new的认识有些小冲突。
大家可以试试看。
...全文
208 15 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
千里之行,起于跬步。对很多平淡无奇基础描述,不重视就可能形成认识的谬误。如果一句句真理解了,就自然而然了。
liangws 2011-10-31
  • 打赏
  • 举报
回复
因为new 执行函数只能返回一个实例,如果引擎发现return 值是基本类型,如
var str = new function()
{
return "Hello world!";
};

它就会返回这个匿名函数的实例,如果将例子改成如下,会更清楚

var str = new function() {
this.name = "123";
return "Hello world!";
};

alert(str.name);//123 可知str是匿名函数的实例

再看例子

var str = new function() {
this.name = "111";
};

如果没return 一个实例的情况下,会返回该匿名函数的实例

alert(str.name);//111

但是如果,返回了一个实例
var str = new function() {
this.name = "111";
var a = new String("111");
return a;
};
alert(str.name); //undefined
alert(str); //111
可知str是new String("111")的实例a



所以可推出,第二个例子打印Hello world!
var str = new function()
{
return new String("Hello world!");
};

等同于

var str = new function()
{
var a = new String("123");
return a // 这里返回一个String的实例a
};

它就会返回String的实例a,
foolbirdflyfirst 2011-10-31
  • 打赏
  • 举报
回复
啊,我上面要回复的是cj205.
fanchuanzhidu同学你说的没错,说不定以后ecmascript标准改了,咱又得转一次脑筋。
好吧,那差不多就结贴吧,哥有的是分,不怕弄不懂,就怕没问题。
foolbirdflyfirst 2011-10-31
  • 打赏
  • 举报
回复
嗯,你引用那个在
http://stackoverflow.com/questions/7064673/is-return-from-constructor-necessary-when-creating-object-with-new
这个链接里也看到了,而且关键的几点都标粗了
11.2.2 The new Operator
..
..
5.Return the result of calling the [[Construct]] internal method on constructor, providing no arguments (that is, an empty list of arguments).

13.2.2 [[Construct]]
..
..
9.If Type(result) is Object then return result.
10.Return obj.


准确的说,我连代码都写得少了,呵呵。
以前老觉得return不应该影响new,new主要是执行contructor,连接prototype。倒没注意到new出来的东西要根据constructor里return的东西判断取值。
豆虫 2011-10-31
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 foolbirdflyfirst 的回复:]
引用 5 楼 fanchuanzhidu 的回复:

楼主顶楼和3楼的代码都没有问题 为什么会出现这种情况 是因为function中的return的原因
拿楼主3楼的代码做说明:
JScript code
var str = function(){
this.a = 1;
}

var str2 = function(){
this.a = 2;
return new str……
[/Quote]
呵呵 其实这也是一种学习的方式 我个人觉得这样挺好 有问题大家一起探讨
语言间有共同点也肯定有差异 js就这样
就像你6楼的解释一样 它就那么规定的 你能咋着 是吧 呵呵
Mr-Jee 2011-10-31
  • 打赏
  • 举报
回复
那个帖子里我引用的那个哥们的很强大
另外 你好像很久没接触js了。
[Quote=引用 6 楼 foolbirdflyfirst 的回复:]

引用 4 楼 cj205 的回复:

引用 3 楼 foolbirdflyfirst 的回复:

来个简单的。
JScript code
var str = function(){
this.a = 1;
}

var str2 = function(){
this.a = 2;
return new str();
}

var os2 = new str2();……
[/Quote]
foolbirdflyfirst 2011-10-31
  • 打赏
  • 举报
回复
nothing, null, or any atomic / non-object
==================================
返回空,null,或任何原子量/非对象值 将被忽略。

这个atomic似乎又引出javascript的typeof

typeof 111;//number
typeof new Number(111);//object
foolbirdflyfirst 2011-10-31
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 fanchuanzhidu 的回复:]

楼主顶楼和3楼的代码都没有问题 为什么会出现这种情况 是因为function中的return的原因
拿楼主3楼的代码做说明:
JScript code
var str = function(){
this.a = 1;
}

var str2 = function(){
this.a = 2;
return new str();//不管这句之前做了什么 最后该函数……
[/Quote]
这种特征在其它语言很难见到,呵呵,所以容易给绕进去。
关键是javascript的new和其它语言的new不一样,它还要执行Constructor,并且判断内部return的东西。什么该return,什么该忽略。.
foolbirdflyfirst 2011-10-31
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 cj205 的回复:]

引用 3 楼 foolbirdflyfirst 的回复:

来个简单的。
JScript code
var str = function(){
this.a = 1;
}

var str2 = function(){
this.a = 2;
return new str();
}

var os2 = new str2();

alert(os2.a);//1还……
[/Quote]
嗯,好吧,我漏过了
http://stackoverflow.com/questions/7064673/is-return-from-constructor-necessary-when-creating-object-with-new
这个链接,里面有说
If a constructor function returns nothing, null, or any atomic / non-object value then said value is ignored and the newly created object reference is given back to the caller. For example, a return value of 0 (zero) from a constructor function will be ignored.
返回空,null,或任何字面量/非对象值 将被忽略。
呵呵,javascript还真有意思。
豆虫 2011-10-31
  • 打赏
  • 举报
回复
其实这个也不是new的理解的问题 new就是调下它自己的构造函数罢了 传递一个指针给新建的对象作为this

var str2 = function(){
this.a = 2;
return this;//这样也是没问题的 这样最后就能alert出2了
}

豆虫 2011-10-31
  • 打赏
  • 举报
回复
楼主顶楼和3楼的代码都没有问题 为什么会出现这种情况 是因为function中的return的原因
拿楼主3楼的代码做说明:
var str = function(){
this.a = 1;
}

var str2 = function(){
this.a = 2;
return new str();//不管这句之前做了什么 最后该函数返回一个str对象
}

var os2 = new str2();//这就不是一个纯洁的str2对象了 而实际上是一个str对象 就是上边return的作用

alert(os2.a);//那这里大家说 它不返回1还要返回什么呢
Mr-Jee 2011-10-31
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 foolbirdflyfirst 的回复:]

来个简单的。
JScript code
var str = function(){
this.a = 1;
}

var str2 = function(){
this.a = 2;
return new str();
}

var os2 = new str2();

alert(os2.a);//1还是2?哈哈,可以拿来当面试题了。
[/Quote]

var str = {a:1};
var str2 = function() {
this.a = 1;
return str; //这里new了么?
}
var test = new str2();
alert(test.a);
foolbirdflyfirst 2011-10-31
  • 打赏
  • 举报
回复
来个简单的。
var str = function(){
this.a = 1;
}

var str2 = function(){
this.a = 2;
return new str();
}

var os2 = new str2();

alert(os2.a);//1还是2?哈哈,可以拿来当面试题了。

懒得搭理你 2011-10-31
  • 打赏
  • 举报
回复
最近也是正在学习js的面向对象,个人感觉怪怪的。。。

87,996

社区成员

发帖
与我相关
我的任务
社区描述
Web 开发 JavaScript
社区管理员
  • JavaScript
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧