请看下面的脚本:
var x = function(param){
this.data=param;
this.y = function(){
alert(this.data)
}
return this;
}
/*
x.prototype.z = function(){
alert(this.data);
}
*/
x(123).y();
x(123).z(); // This should behave same as y()
当我调用 x(123).y() 时,消息显示 123。在 x()
中声明的函数 y()现在我想声明另一个函数 z(),它位于 x() 之外,但会行为与 y() 相同 [与 x() 关联]
这可能吗?如果可能怎么办?
最佳答案
调用 x()
时,您缺少一个 new
。否则,函数体内的 this
将引用全局对象(浏览器上下文中的 window
)而不是 x
的实例。
这就是为什么调用 z()
(在取消注释代码之后)不起作用的原因。调用 y()
只是巧合,因为您创建了一个全局变量 data
,其值将被下一次调用 x()
覆盖.
我不知道你想要完成什么,据我所知,这很可能不是一个好主意。无论如何,这里有一个示例,说明如何在创建对象时摆脱显式 new
:
var x = function(param){
// add missing `new`:
if(!(this instanceof x))
return new x(param);
this.data=param;
this.y = function(){
alert(this.data)
}
}
x.prototype.z = function(){
alert(this.data);
}
x(123).y();
x(456).z();
关于对象外的JavaScript函数封装,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1518782/