Javascript 如何构建类似构造函数的函数?
当我阅读第6章面向对象编程的面向Web开发人员的专业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值指
// implicit way
function Person(name) {
this.name = name;
}
var person1 = new Person('Greg')
person1 instanceof Person
要创建Person的新实例,请使用新操作符。以这种方式调用构造函数基本上会导致采取以下四个步骤:
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,不要道歉。从你的回答中我学到了很多。但很遗憾你们两个删除了评论。我认为这对我们也有帮助。我还没有时间研究它们。