1

请参阅以下脚本:

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() [associate with x() ]

可能吗?如果可能怎么办?

4

3 回答 3

3

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-05T08:17:21.490 回答
1

z这是可能的,如果您修复了创建xs 的方式,您的注释掉的函数应该可以正常工作。

请注意,如果您的函数y仅处理实例属性(在您的代码中是这样),则不必在构造函数中声明它,并且这样做会消耗大量内存(每个实例都有自己的该函数的副本)。考虑到所涉及的成本,如果出于主要数据隐藏原因绝对必须这样做,您只想这样做。

编辑:对不起,我错过了一些东西:你错过了new关键字,你的例​​子应该是:

new x(123).y();
new x(123).z();

...并且您的构造函数不应该返回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();

这是我上面提到的 Crockford 文章,但同样,它对记忆有很大的影响。

于 2009-10-05T08:15:06.843 回答
0
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关键字在其外部定义了一个原型方法。

正如其他人所说:

  • 你不需要this在构造函数中返回
  • 你用new关键字调用它
  • 声明的所有方法this都是公共的,除非您var在这种情况下使用它们变成私有的
于 2009-10-05T08:29:31.680 回答