请参见以下脚本:
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。函数y()在x()中声明
现在我想声明另一个函数z(),它将驻留在x()之外,但其行为与与x()关联的y()相同。
有可能吗?如果可能的话,怎么做?
发布于 2009-10-05 08:17:21
在调用new时,您丢失了一个x()。否则,函数体中的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();发布于 2009-10-05 08:15:06
这是可能的,并且您的注释掉的z函数应该可以像修复如何创建x那样工作。
注意,如果您的函数y只处理实例属性(在代码中是这样的),并且这样做的内存开销很大(每个实例都有自己的副本),那么它就不必在构造函数中声明。考虑到所涉及的成本,只有当你为了主要的数据隐藏原因而不得不这样做的时候,你才会想要这么做。
编辑:对不起,我遗漏了一些东西:您缺少了new关键字,您的示例应该是:
new x(123).y();
new x(123).z();...and构造函数不应该返回this。
完整的例子:
var x = function(param) {
this.data=param;
// Doesn't have to be in the constructor, and you should
// avoid it unless you're doing something with major
// data hiding a'la Crockford
this.y = function() {
alert(this.data)
}
}
x.prototype.z = function() {
alert(this.data);
}
new x(123).y();
new x(123).z();我在上面提到过这是克罗克福德的文章,但同样,它有很大的内存含义。
发布于 2009-10-05 08:29:31
function generator( param ) {
this.data = param;
this.y = function() {
alert( this.data )
}
}
generator.prototype.z = function() {
alert( this.data );
}
x = new generator( 3 );
x.y()
x.z()不确定这是否是您想要的,但这是一个名为generator的构造函数,它返回一个对象,并使用new关键字在其外部定义了一个原型方法。
如其他人所述:
thisnew关键字调用它this声明的所有方法都是公共的,除非使用var,在这种情况下,它们成为私有方法。https://stackoverflow.com/questions/1518782
复制相似问题