有没有办法在Javascript中创建一个对象,以便构造函数可以使用它的所有方法?
我发现很难清楚地说出我的问题......这是一个例子!
鉴于此课程
function Example() {
var someVar = something;
var moreState = initializedToSomethingElse;
verifySomething(); <-- Fails!
this.verifySomething = function() {
// do verify stuff
}
}
我无法在构造函数中调用verifySomething
,因为就实例而言,该方法尚不存在。所以,我得到一个未定义的错误。有没有更好的方法在JavaScript中创建对象,以便我可以避免这个问题?
答案 0 :(得分:5)
有没有办法在Javascript中创建一个对象,以便构造函数可以使用它的所有方法?
您可以在创建后调用任何方法。在您的示例中,有两个问题:
您尚未创建该方法
您正在调用它 - 在JavaScript中,使用对象限定符(通常在构造函数中为this.
)不是可选的,因为它在某些其他语言中是
如果在构造函数的prototype
属性上定义方法,只要这些赋值在调用构造函数之前发生(通常是真的,并且有保证它的技术),这些方法将在{ {1}}在构造函数中。如果在构造函数中创建方法(如示例所示),只需先创建它们。
以下是使用构造函数的this
属性的示例,该属性引用将用作通过prototype
创建的实例原型的对象:
new
这是一个在构造函数中定义的示例,该示例利用函数声明(而不是表达式)被“提升”的事实(在任何逐步执行代码之前完成)。
function Example() {
var someVar = something;
var moreState = initializedToSomethingElse;
this.verifySomething(); // <== Works
}
Example.prototype.verifySomething = function() {
// do verify stuff
};
var e = new Example();
如果您在调用之前真的不喜欢这样做,那么可以使用function Example() {
var someVar = something;
var moreState = initializedToSomethingElse;
this.verifySomething = verifySomething; // <== Note we assign first
this.verifySomething(); // <== Works
function verifySomething() {
// do verify stuff
}
}
var e = new Example();
:
.call
我在上面提到过,有些技术可以保证构造函数的function Example() {
var someVar = something;
var moreState = initializedToSomethingElse;
verifySomething.call(this); // <== Works
// this.verifySomething(); // <== Would not work
this.verifySomething = verifySomething; // <== Note we assign after
function verifySomething() {
// do verify stuff
}
}
var e = new Example();
属性在调用构造函数之前已经完全充实。这是其中之一(使用范围函数):
prototype
通过上述内容,在包含直接调用的作用域函数之外的代码无法使用var Example = (function() {
function Example() {
var someVar = something;
var moreState = initializedToSomethingElse;
this.verifySomething(); // <== Works
}
Example.prototype.verifySomething = function() {
// do verify stuff
};
return Example;
})();
var e = new Example();
,直到该作用域函数完成后,因此完全设置Example
属性。