我想知道JavaScript是否允许在使用构造函数构造对象的过程中调用函数或方法,因为它的工作只是创建对象。
示例:
function Animal(name) {
this.name = name;
alert("I am called in the constructor-function. Is it allowed?");
}
var x = new Animal("Bird");
这样可以正常工作(它会创建对象并提醒消息)但是可以这样做吗?
答案 0 :(得分:3)
当然!
构造函数就像任何其他函数一样,除了它们设置对象。您可以从它们中调用您需要/想要的任何内容(在某些情况下/语言甚至是该对象的另一个构造函数)
为了在JavaScript中进行调试,警报很好。
答案 1 :(得分:0)
是的,的确如此。 “构造函数”实际上是一个初始化例程,在对象物理分配到内存中以便设置初始值之后调用。因此,您可以在其中调用其他方法,但我通常会提醒您不要使用此类设计。
我通常做的是定义另一个方法,比如init()
,我必须在实例化之后在我自己的代码中调用一个新对象。 (我必须记住,在我的应用程序中,无处不在。)构造函数执行基本的,甚至是通用的设置,然后我的init
例程执行更多操作。
因为,IIRC,JavaScript实际上没有“析构函数”,我还经常定义一个free()
例程,再一次,我不得不在一个对象上调用它然后让它消失在阴暗之中,最终收获。
这是一种自我强加的学科,对我来说似乎很有效。
答案 2 :(得分:0)
是
您的主要担心似乎依赖于功能?在警报的情况下,这种恐惧可能是没有根据的,因为警报是大多数javascript实现的原生。鉴于此,这是一个注入函数的愚蠢示例,它允许解耦构造函数及其依赖的函数:
function alertSomething (message){
alert(message);
}
function logSomething (message){
console.log(message);
}
//inject the function into your constructor instead
function Animal(name, messageDeliverySystem){
this.name = name;
this.deliverMessage = messageDeliverySystem;
}
var animalWhoLikesToLog = new Animal("Bob the logging bear", logSomething);
var animalWhoPrefersAlert = new Animal("Franky the alert happy Seal", alertSomething);
animalWhoLikesToLog.deliverMessage("Hi, I am Bob");
animalWhoPrefersAlert.deliverMessage("Hi, Franky here!");
就像我说的那样,这很愚蠢,因为console.log和alert在大多数情况下是原生的,但它可以帮助你理解。