Javascript 为什么';我的自定义对象的公共方法不存在吗?

Javascript 为什么';我的自定义对象的公共方法不存在吗?,javascript,jquery,oop,Javascript,Jquery,Oop,我一直在试图找出为什么我的自定义jQuery插件对象的公共方法看起来不存在 我已经创建了jQuery插件的简化版本,其中包含一个私有变量和两个访问/修改私有变量的公共方法。我在网上查过,但结果不太清楚,或者说我的搜索能力很差 它一直在说“TypeError:myObject.getMyValue不是函数”,有人知道我做错了什么,或者有人建议更好的方法吗 下面是基本的对象类,但是可以在JSFIDLE链接上找到适当的代码示例 (function ($) { var MyClass = fu

我一直在试图找出为什么我的自定义jQuery插件对象的公共方法看起来不存在

我已经创建了jQuery插件的简化版本,其中包含一个私有变量和两个访问/修改私有变量的公共方法。我在网上查过,但结果不太清楚,或者说我的搜索能力很差

它一直在说“TypeError:myObject.getMyValue不是函数”,有人知道我做错了什么,或者有人建议更好的方法吗

下面是基本的对象类,但是可以在JSFIDLE链接上找到适当的代码示例

(function ($) {

    var MyClass = function (element) {

        var myValue = 'Hello World';

        this.getMyValue = function() {
            return myValue;
        };

        this.setMyValue = function(value) {
            myValue = value;
        };

        return this;
    };

    $.fn.myPlugin = function() {
        return this.each(function(key, value){
            if ($(this).data('myclass')) {
                return $(this).data('myclass');
            }

            var instance = new MyClass(this);
            $(this).data('myclass', instance);
            return instance;
        });
    };

})(jQuery);

var myObject = $('#test').myPlugin();

alert(myObject.getMyValue());
myObject.setMyValue('Goodbye World');
alert(myObject.getMyValue());

因为您正在返回this.each()的结果,它将是this。在
this.each()之外创建一个变量,并在
this.each完成后返回该变量


如果您想返回MyClass的数组(如果您的jQuery对象是一个集合),您可以这样做:


因为您正在返回this.each()
的结果,它将是this
。在
this.each()之外创建一个变量,并在
this.each完成后返回该变量


如果您想返回MyClass的数组(如果您的jQuery对象是一个集合),您可以这样做:


因为您确实返回了这个。每个
因此您的
myPlugin()调用都会返回用于链接性的jQuery对象。您正在执行的
return实例
调用只是将其返回给该函数的迭代器函数。每个都会丢弃该值。在函数中使用多个返回的经典错误-错误做法-使用了很多…@iGanja-在函数中使用多个返回是错误的。除非它没有“正确使用”,就像在这个例子中。。。单个返回没有这样的警告。因为您确实
返回了它。每个
因此您的
myPlugin()
调用都会返回jQuery对象的可链接性。您正在执行的
return实例
调用只是将其返回给该函数的迭代器函数。每个
都会丢弃该值。在函数中使用多个返回的经典错误-错误做法-使用了很多…@iGanja-在函数中使用多个返回是错误的。除非它没有“正确使用”,就像在这个例子中。。。单次返回没有这样的警告。非常感谢您的回答,我应该非常诚实地意识到这一点。您是说最好像这样返回实例,还是您认为最好返回jQuery内容,并提供某种新方法来返回对象的实例?另外,在这个例子中,如果我们将插件应用于多个选择器,那么它仍然只返回最后创建的实例?如果这有意义的话?更新添加另一个版本以在集合上调用时返回数组。嗯,是的!太好了,谢谢你。仍然不能相信我没有意识到在我的第一个示例代码中我实际上没有返回对象实例。非常感谢Daniel。非常感谢您的回答,这是我应该非常诚实地意识到的。您认为最好像这样返回实例,还是最好返回jQuery内容,并提供某种新方法来返回对象的实例?另外,在这个例子中,如果我们将插件应用于多个选择器,那么它仍然只返回最后创建的实例?如果这有意义的话?更新添加另一个版本以在集合上调用时返回数组。嗯,是的!太好了,谢谢你。仍然不能相信我没有意识到在我的第一个示例代码中我实际上没有返回对象实例。非常感谢丹尼尔。
$.fn.myPlugin = function() {
    var instance;
    this.each(function(key, value){
        if ($(this).data('myclass')) {
            return $(this).data('myclass');
        }

        instance = new MyClass(this);
        $(this).data('myclass', instance);
    });
    return instance;
};
$.fn.myPlugin = function() {
    var instances = [];
    this.each(function(key, value){
        if ($(this).data('myclass')) {
            return $(this).data('myclass');
        }

        var instance = new MyClass(this);
        $(this).data('myclass', instance);
        instances.push(instance);
    });
    if (instances.length == 1)
        return instances[0];
    return instances;
};