首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JavaScript函数封装在对象外部

JavaScript函数封装在对象外部
EN

Stack Overflow用户
提问于 2009-10-05 08:09:51
回答 3查看 2.7K关注 0票数 1

请参见以下脚本:

代码语言:javascript
复制
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()相同。

有可能吗?如果可能的话,怎么做?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2009-10-05 08:17:21

在调用new时,您丢失了一个x()。否则,函数体中的this将引用全局对象(浏览器上下文中的window),而不是x的实例。

这就是为什么调用z() (在未注释代码之后)不起作用的原因。调用y()只是巧合,因为您创建了一个全局变量data,其值将被下一次对x()的调用覆盖。

我不知道你想要实现什么,从我看来,这很可能不是个好主意。无论如何,下面是一个如何在创建对象时摆脱显式new的示例:

代码语言:javascript
复制
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();
票数 3
EN

Stack Overflow用户

发布于 2009-10-05 08:15:06

这是可能的,并且您的注释掉的z函数应该可以像修复如何创建x那样工作。

注意,如果您的函数y只处理实例属性(在代码中是这样的),并且这样做的内存开销很大(每个实例都有自己的副本),那么它就不必在构造函数中声明。考虑到所涉及的成本,只有当你为了主要的数据隐藏原因而不得不这样做的时候,你才会想要这么做。

编辑:对不起,我遗漏了一些东西:您缺少了new关键字,您的示例应该是:

代码语言:javascript
复制
new x(123).y();
new x(123).z();

...and构造函数不应该返回this

完整的例子:

代码语言:javascript
复制
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();

我在上面提到过这是克罗克福德的文章,但同样,它有很大的内存含义。

票数 1
EN

Stack Overflow用户

发布于 2009-10-05 08:29:31

代码语言:javascript
复制
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,在这种情况下,它们成为私有方法。
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1518782

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档