Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/434.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在javascript中使用原型模式?_Javascript_Prototype - Fatal编程技术网

如何在javascript中使用原型模式?

如何在javascript中使用原型模式?,javascript,prototype,Javascript,Prototype,我有一个简单的场景,如下所示: 在HTML页面上,有一个简单的表,其中显示项目列表。此网格具有类似“全选”复选框的功能 使用“单击复选框”时,应选择网格中的所有项目 我正在使用以下脚本开始: (function (window, $) { var UnfreezeTest = function () { return new UnfreezeTest.init(); } //Create prototype to add new methods her

我有一个简单的场景,如下所示:

在HTML页面上,有一个简单的表,其中显示项目列表。此网格具有类似“全选”复选框的功能

使用“单击复选框”时,应选择网格中的所有项目

我正在使用以下脚本开始:

(function (window, $) {

    var UnfreezeTest = function () {
        return new UnfreezeTest.init();
    }

    //Create prototype to add new methods here 

    UnfreezeTest.prototype = {
        selectAll: function (chkAllElement) {
            $(".js-chk input[type='checkbox']").attr("checked", chkAllElement.checked);
        },
        reset: function () { 

        }
    };

    UnfreezeTest.init = function () {
        //Initialize any object here 
        //Example 
        //this.propertyName = value;
    }

    //Assign prototype for newly created object to point to the methods
    UnfreezeTest.init.prototype = UnfreezeTest.prototype;

    window.UnfreezeTest = UnfreezeTest;


} (window, jQuery));
我不想在创建对象时使用new操作符

我想使用如下:

var obj = UnfreezeTest();

有什么建议吗?或者我做得对吗?

如果我理解正确,为了创建原型的实例,我认为您需要以下内容:

var UnfreezeTest=函数tableId{ this.tableId=tableId; } 解冻测试。原型={ selectAll:函数chkallement{ $+this.tableId+.js chk输入[type='checkbox'].attrchecked,chkallement.checked; }, 重置:函数{ } }; var unfreeze1=新的UnfreezeTest'myTable1'; 解冻1.选择全部; var unfreeze2=新的解冻测试'myTable2';
解冻2.选择全部 不幸的是,答案是否定的,你做得不对

理由是

UnfreezeTest是一个工厂函数,而不是构造函数。它返回一个对象。因此,使用new UnfreezeTest调用它没有什么区别——它返回UnfreezeTest.init的实例,调用中使用的新操作符将该实例传递回调用方

UnfreezeTest.init是构造函数。应在UnfreezeTest.init.prototype上设置其实例的任何原型属性

在UnfreezeTest.prototype上设置继承属性,然后将UnfreezeTest.init.prototype设置为UnfreezeTest.prototype,然后从调用UnfreezeTest返回UnfreezeTest.init的实例,这是一个混淆练习


如果唯一的目标是能够创建该调用的实例(有新的和没有新的),那么您可以这样做:

函数UnfreezeTesttableId{ //检查这是否是UnfreezeTest的实例 如果!这是解冻的时刻{ //如果不是,则函数未使用new调用,因此请创建一个实例 返回新的UnfreezeTesttableId } this.tableId=tableId; } 解冻测试。原型={ selectAll:函数chkallement{ $+this.tableId+.js chk输入[type='checkbox'].attrchecked,chkallement.checked; }, 重置:函数{ } }; console.dirUnfreezeTest1234
console.dirnew UnfreezeTest1234您可以使用的另一种模式,它不需要原型或单词 “新”是指:

函数UnfreezeTesttableId{ var tableId=tableId; var obj={ selectAll:函数chkallement{ $+tableId+.js chk输入[type='checkbox'].attrchecked,chkAllElement.checked; }, 重置:函数{ } }; 返回obj; }
var unfreeze=UnfreezeTesttableId;这取决于你想做什么。在代码评审中,我会说return new UnfreezeTest.init和UnfreezeTest.init.prototype=UnfreezeTest.prototype是错误的,除非您可以给出这样做的一个很好的理由,不是因为这样做不起作用,而是因为现在这样做没有任何意义。我想创建prototype。所以所有创建的对象共享相同的方法。那么,有什么建议上面的代码在做什么吗?什么是正确的做法?您能提供一些说明吗?为什么要避免出现这种新情况?未使用的窗口参数的意义是什么,jQuery实例参数是否与代码加载在同一个窗口中,即它为什么在那里?代码也在工作吗?如果是这样的话,你可能在错误的论坛上发布了。谢谢你的回答。但我不想在创建对象时使用new操作符。我想使用如下:var obj=UnfreezeTest;不幸的是,我不明白你在说什么。你能花点时间解释一下这个概念吗?在这个答案发布后,你修改了这个问题。为什么要避免使用new-before调用解除冻结测试?我的建议是,如果UnfreezeTest没有作为构造函数调用,而不是柔和地执行其他操作,则抛出一个错误。