Javascript 如何构建类似构造函数的函数?

Javascript 如何构建类似构造函数的函数?,javascript,ecmascript-6,Javascript,Ecmascript 6,当我阅读第6章面向对象编程的面向Web开发人员的专业JavaScript时,它显示了一种通过构造函数创建对象的模式 // implicit way function Person(name) { this.name = name; } var person1 = new Person('Greg') person1 instanceof Person 要创建Person的新实例,请使用新操作符。以这种方式调用构造函数基本上会导致采取以下四个步骤: 创建一个新对象 将构造函数的this值指

当我阅读第6章面向对象编程的面向Web开发人员的专业JavaScript时,它显示了一种通过构造函数创建对象的模式

// implicit way
function Person(name) {
  this.name = name;
}

var person1 = new Person('Greg')
person1 instanceof Person
要创建Person的新实例,请使用新操作符。以这种方式调用构造函数基本上会导致采取以下四个步骤:

  • 创建一个新对象

  • 将构造函数的this值指定给新对象(因此它指向新对象)

  • 在构造函数中执行代码(向新对象添加属性)

  • 返回新对象

  • 显示如何创建对象实例的隐式方式

    我想明确地遵循它。比如:

    function Person(name) {
      var o = Object.call(this)  // step 1 and step 2
      o.name = name              // step 3
      return o                   // step 4
    }
    
    var person1 = new Person('Greg')
    person1 instanceof Person // false
    
    事实上,它不能作为构造函数模式工作。为什么?我如何修改代码,以显式方式创建构造函数

    因为
    对象.call(this)
    没有什么意义,因为该函数不关心其上下文,而是返回一个普通对象。相反,您可以使用:

      Object.create(this.constructor.prototype)
    

    引用的这本书遗漏了
    新功能的一个非常重要的细节:

    1创建一个新对象

    真的意味着

    1.1创建一个新对象

    1.2已在构造函数的
    prototype
    属性上原型化

    因此,结果如下:

    职能人员(姓名){
    var o=Object.create(Person.prototype);
    o、 name=name//步骤3
    返回o//步骤4
    }
    var person1=新人('Greg')
    console.log(person1 instanceof Person);//符合事实的
    
    console.log(person1.constructor)//Person
    Jonas Wilms有答案,但请注意,如果您实现这样的构造函数,它实际上并不像一个正确的构造函数,您将无法使用
    类扩展继承它。这只是一个常规函数。(以同样的方式继续使用
    new
    有点误导。)
    Object.call(this)
    不会做您认为它做的事情-
    Object
    函数忽略它的上下文。你到底想做什么?你仍然在用
    new
    调用第二个
    Person
    函数,那么做两次又有什么意义呢?这很难得到你想要的。谢谢。你节省了我的时间!我使用
    对象。创建(这个)
    也有相同的结果。这似乎是按照书中的描述。你能给我看一些关于新构造函数原型的文章吗?我想不出这个概念:)如果你做了
    对象。创建(这个)
    原型链是
    o->this->Person.prototype->Object.prototype
    。。。我建议的方法创建了
    o->Person.prototype->Object.prototype
    ,因此链中没有未使用的对象。您的体验非常丰富。非常感谢。谢谢你的回答,我的目的是弄清楚构造函数是什么。因为我可以使用它,但我不知道后面会发生什么。我将仔细阅读:)Erice,我的道歉-函数原型属性的
    构造函数
    属性是在函数对象由
    函数
    创建的同时创建的,而不是
    新建
    @谢谢,我已经删除了I.3.OMG,不要道歉。从你的回答中我学到了很多。但很遗憾你们两个删除了评论。我认为这对我们也有帮助。我还没有时间研究它们。