V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐关注
Meteor
JSLint - a JavaScript code quality tool
jsFiddle
D3.js
WebStorm
推荐书目
JavaScript 权威指南第 5 版
Closure: The Definitive Guide
mopig
V2EX  ›  JavaScript

当函数返回对象的时候, new func() 与 func() 效果是一样的么?

  •  
  •   mopig · 2014-07-03 12:19:37 +08:00 · 4493 次点击
    这是一个创建于 3586 天前的主题,其中的信息可能已经有所发展或是发生改变。
    19 条回复    2014-07-05 11:27:03 +08:00
    housne
        2
    housne  
       2014-07-03 12:35:55 +08:00   ❤️ 1
    - - 貌似是一样的,但为什么这里要 new 呢 。。。
    chraac
        3
    chraac  
       2014-07-03 12:48:04 +08:00   ❤️ 1
    this不一样了吧
    jsonline
        4
    jsonline  
       2014-07-03 12:58:41 +08:00 via Android   ❤️ 1
    当然不一样。
    任何一本JS书里都写了 new 操作符做了什么事情。
    bigcoon
        5
    bigcoon  
       2014-07-03 13:09:50 +08:00   ❤️ 1
    应用层面来说无本质区别,calculator 和 Calculator() 返回的对象是一样的
    lijsh
        6
    lijsh  
       2014-07-03 13:13:06 +08:00   ❤️ 3
    首先,用new调用与不使用new调用的区别在于,前者会隐式返回一个实例,函数体内的this指向这个实例;

    但如果函数显式返回一个对象,那么new func()里面this的操作虽然还是针对实例对象,但返回的时候这个实例对象会被丢弃,new func()和func()的效果就是一样的。

    注意这里返回的必须是对象,如果return的是字符串或者Number,那就不会有效果,构造函数原来的行为会得到保留。

    参考: http://bonsaiden.github.io/JavaScript-Garden/zh/#function.constructors
    zewenzhang
        7
    zewenzhang  
       2014-07-03 13:17:04 +08:00   ❤️ 1
    完全一样
    lijsh
        8
    lijsh  
       2014-07-03 13:28:53 +08:00   ❤️ 1
    举个例子
    var a = function(name) {
    this.name = name;
    console.log(this.name);
    return {
    sayName: function() {
    console.log(this.name);
    }
    }
    }

    var A = new a("Jason") //this指向实例,输出"Jason";返回一个包含sayName方法的对象

    A.sayName(); //this指向全局,输出"undefined"
    lijsh
        9
    lijsh  
       2014-07-03 13:29:48 +08:00   ❤️ 1
    缩进居然不支持……擦
    chemzqm
        10
    chemzqm  
       2014-07-03 13:43:01 +08:00   ❤️ 1
    除非你是构造函数实例化一个对象,否则别用 new.
    如果你想让调用者可以省略new 关键字,可以这么搞:

    function Notice(msg, options) {
    if (! (this instanceof Notice)) return new Notice(msg, options);

    这样有没有 new 调用 Notice 就完全一样了
    otakustay
        11
    otakustay  
       2014-07-03 13:50:27 +08:00   ❤️ 1
    函数内部的this会不一样,抛开逻辑光从返回值上来说new和没有new是一样的了,比如

    function xx() {
    return { x: 1 };
    }

    这样xx()和new xx()是完全一样的
    bravluna
        12
    bravluna  
       2014-07-03 14:37:46 +08:00
    答案:一样的。可是这样写很容易引起困扰,因为它依赖一个硬性规定,就是如果构造函数返回了一个对象,那么这个对象会替代 new 操作符产生的对象而成为 new 对象创建表达式的值。所以,如果想把一个函数当成构造函数,就不要包含 return 语句。
    coolicer
        13
    coolicer  
       2014-07-03 15:13:46 +08:00
    上面已经有人回答了,不一样。new过之后,this指向明显不一样。
    chshouyu
        14
    chshouyu  
       2014-07-03 16:08:11 +08:00
    @lijsh 答案
    lijsh
        15
    lijsh  
       2014-07-03 16:46:08 +08:00
    @chshouyu 啥?
    lotem
        16
    lotem  
       2014-07-03 17:54:59 +08:00
    @lijsh 8樓的程序裏 A.sayName() 輸出 undefined 只是因爲a()返回對象的name屬性沒有值吧,this指向對象A。
    lotem
        17
    lotem  
       2014-07-03 18:03:35 +08:00
    > var a = function(name) {
    ... this.name = name;
    ... console.log(this.name);
    ... return {
    ..... name: "Tuzki",
    ..... sayName: function() {
    ....... console.log(this.name);
    ..... }
    ... }
    . }
    undefined
    > var A = new a("Jason")
    Jason
    undefined
    > A.sayName();
    Tuzki
    undefined
    >
    不影響結論,那個 name=="Jason" 的對象被丟棄了。
    lijsh
        18
    lijsh  
       2014-07-03 19:25:59 +08:00 via Android
    @lotem 就是这样
    xieranmaya
        19
    xieranmaya  
       2014-07-05 11:27:03 +08:00
    这是基础啊大哥
    有new时this指向新创建的对象
    没new时this指向global
    非要处理这种情况的话,一般的做法是
    function Class(){
    if(this==window){// !this instanceof Class
    return new Class();
    }else{
    init();
    }
    }
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   1088 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 23:15 · PVG 07:15 · LAX 16:15 · JFK 19:15
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.