对象外的JavaScript函数封装

标签 javascript oop prototype object encapsulation

请看下面的脚本:

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/

相关文章:

javascript - IE8 无法识别我的正则表达式

c++ - 从多态基指针调用基类方法很慢

javascript - 在 Javascript 中将对象原型(prototype)函数绑定(bind)到对象

javascript - 将控件和事件绑定(bind)到rails中的JS文件

javascript - 完全获取数据后加载状态变化

Python 面向对象 : inefficient to put methods in classes?

Javascript拦截数组设置值

javascript - 这是正确的(JavaScript 原型(prototype)属性)吗?

java - 无法从 JSP 页面检索参数值

javascript - 理解 JavaScript 中的 new 运算符