对象实例化为"";新的";from闭包不能直接访问返回对象的属性

Object instantiated as "new" from closure cannot directly access properties of returned object

本文关键字:quot 对象 访问 返回 属性 from 实例化 新的 闭包 不能      更新时间:2023-09-26

我正在尝试创建一个UI组件的JavaScript库,这些组件通常被我的团队中的项目使用。我有以下代码来定义库。

var libName = function() {
    var _libName = this;
    _libName.componentName = function () {
        // Some Private Variables
        var _componentName = function (args) {
             // Construct the object...
        };
        _componentName.addObject = function (args) {
            // Add an object...
        };
        _componentName.removeObject = function (args) {
            // Remove an object...
        };
        return _componentName;
    }();
    return _libName;
}();

现在,当我在页面中使用它来创建组件时,我会调用以下代码。

var component = new libName.componentName(args);

它初始化得很好,并创建了我所期望的基本组件。现在我想向组件添加一些数据,所以我调用以下函数。

component.addObject(someObject);

但是,它并没有像我期望的那样调用函数,而是说组件对象没有属性"addObject"。我用以下代码对此进行了研究。

if (libName.componentName.addObject) {
    console.log("libName.componentName.addObject exists");    // Logs
} 
if (component.addObject) {
    console.log("component.addObject exists");                // Doesn't log
}
if (component.constructor.addObject) {
    console.log("component.constructor.addObject exists");    // Logs
}

所以我的问题是这里到底发生了什么?为什么对象(在本例中是组件(不能访问我期望的属性/函数?这与我使用记忆闭包来定义库的事实有关吗?如何使从该库初始化的对象能够访问这些属性/函数?

使用函数的原型来定义实例方法:

    _componentName.prototype.addObject = function (args) {
        // Add an object...
    };
    _componentName.prototype.removeObject = function (args) {
        // Remove an object...
    };

脚本不起作用,因为您正在调用_componentName属性,如果在对象上直接定义了这些属性,则这些属性不会传递给_componentRame的实例。记住使用new意味着使用原型继承。Javascript没有基于类的继承。