搜索

首页  >  问答  >  正文

javascript - 这不是对象字面量函数吗?为什么要new初始化?

我记得这个不是构造函数啊,为什么this、new这些都跟构造函数用法一样?

淡淡烟草味淡淡烟草味2698 天前862

全部回复(4)我来回复

  • 学习ing

    学习ing2017-07-05 10:54:40

    javascript 中的任何函数只要用 new 关键字调用,它都可以被称作 构造函数

    当使用 new 关键字调用函数时,函数内部会隐式地声明一个对象,然后把这个对象赋给 this,最后再隐式地返回 this. 使用 new 关键字调用楼主的 book 方法时,就相当于以下过程。

    function Book(id, bookname){
        var o = new Object();
        o.id = id;
        o.bookname = bookname;
        return o;
    }
    var b = Book(123,'javascript高级程序设计');

    这里的 o 其实就是我们平时看到的 this 对象。

    回复
    0
  • 高洛峰

    高洛峰2017-07-05 10:54:40

    javascript 里面没有类,也没有构造函数。

    function Book (){}
    
    // Book 是一个函数
    typeof Book
    "function"
    
    // Book 是 Function
    Book instanceof Function
    true
    
    // Book 是 Object
    Book instanceof Object
    true
    

    使用 new 可以创建对象

    var book = new Book()
    
    // book 是一个对象
    typeof book
    "object"
    
    // book 不是 Function 的实例
    book instanceof Function
    false
    
    // book 是 Object 的实例
    book instanceof Object
    true
    
    // book 是 Book 的实例
    book instanceof Book
    true
    

    虽然 js 中没有构造函数,但是 MDN 文档中也使用了这个词:https://developer.mozilla.org...

    当代码 new foo(...) 执行时:

    • 一个新对象被创建。它继承自 foo.prototype.

    • 构造函数 foo 被执行。执行的时候,相应的传参会被传入,同时上下文(this)会被指定为这个新实例。new foo 等同于 new foo(), 只能用在不传递任何参数的情况。

    • 如果构造函数返回了一个“对象”,那么这个对象会取代整个new出来的结果。如果构造函数没有返回对象,那么new出来的结果。如果构造函数没有返回对象,那么

      出来的结果为步骤1创建的对象,ps:一般情况下构造函数不返回任何值,不过用户如果想覆盖这个返回值,可以自己选择返回一个普通对象来覆盖。当然,返回数组也会覆盖,因为数组也是对象。

    即使 ES6 增加了类,也只是语法糖:🎜
    class Book{}
    
    typeof Book
    "function"
    

    回复
    0
  • 女神的闺蜜爱上我

    女神的闺蜜爱上我2017-07-05 10:54:40

    你理解错了构造函数的概念。

    实际上,js里不应该有‘构造函数’这一说,而应该理解为函数的构造方法。意思是,任何函数都可以拿来new一个,任何函数都可以叫做‘构造函数’。你在写所谓‘构造函数’的时候,有发现它和普通函数有什么区别吗,并没有吧,他们就是普通函数。

    以上,es6箭头函数除外。

    回复
    0
  • 習慣沉默

    習慣沉默2017-07-05 10:54:40

    js里面每个函数都是相当于一个构造函数(除了真ES6箭头函数)。
    哎,神奇的js!

    回复
    0
  • 取消回复