Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/390.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/84.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_Jquery - Fatal编程技术网

Javascript 希望原型方法得到扩展吗

Javascript 希望原型方法得到扩展吗,javascript,jquery,Javascript,Jquery,我有以下代码: var defaults = { test: function () { alert('Test'); } }; function Foo(options) { o = $.extend({}, defaults, options); Foo.prototype.test = o.test; } Foo.prototype.test = default

我有以下代码:

    var defaults = {
        test: function () {
            alert('Test');
        }
    };

    function Foo(options) {
        o = $.extend({}, defaults, options);
        Foo.prototype.test = o.test;
    }
    Foo.prototype.test = defaults; 
我希望测试方法应该是可扩展的,并且我希望它被用作:

    var f = new Foo({
        test: function() {
            alert('Test2');
        }
    });

    var f1 = new Foo({
        test: function () {
            alert('Test3');
        }
    });

    f.test();//alert(test2) should be called
    f1.test(); //alert(test3) should be called

编辑:我没有把我在评论中写的东西作为输出。

你就不能这样做吗

function Foo(options) {
    o = $.extend({}, defaults, options);
    this.test = o.test;
}

你就不能这么做吗

function Foo(options) {
    o = $.extend({}, defaults, options);
    this.test = o.test;
}

你把隐喻混在一起了。你有三个选择:

  • 功能性
  • 简单的构造函数,每个实例重写(您试图做的事情)
  • 可重用原型遗传
功能的 听起来你喜欢Douglas Crockford喜欢的函数继承形式,它摒弃了原型,转而支持他所谓的“制造者”函数:

var f = makeFoo({
    test: function() {
        alert('Test2');
    }
});

var f1 = makeFoo({
    test: function () {
        alert('Test3');
    }
});

f.test();
f1.test();
…其中,
makeFoo
是:

function makeFoo(options) {
    return $.extend({}, makeFoo.defaults, options);
}
makeFoo.defaults = {
    test: function() {
        alert("Default test");
    }
};
|

我自己也不是一个超级粉丝,但是有很多人是,当然和大多数事情一样,它有优点和缺点。优点之一是它有多简单

简单构造函数,每个实例重写 但是你可以用构造函数来实现,就像你尝试过的那样;您可以将选项应用于此,而不是创建自己的单独对象:

function Foo(options) {
    $.extend(this, options);
}
Foo.prototype.test = function() {
    alert("Default test");
};

var f = new Foo({
    test: function() {
        alert("Test2");
    }
});

var f2 = new Foo({
    test: function() {
        alert("Test3");
    }
});

f.test();
f2.test();
|

可重用原型遗传 如果您想更进一步,并基于原型继承建立适当的层次结构(这样您就可以使用特定的覆盖
test
函数创建多个对象),有更多的管道工作要做,但您有一个优势,即调用“super”版本的函数可以非常直接。管道系统非常复杂,我使用了一个库来实现它,在我的例子中,我自己的库叫做,但Prototype有一个类似的库叫做,还有其他几个库

在执行原型继承时,您拥有构造函数,然后使用它们构造实例。对于
沿袭
,上述内容可能与此类似:

var ParentFoo = Lineage.define(function(p) {
    p.test = function() {
      alert("Default test");
    };
});

var FooChild1 = Lineage.define(ParentFoo, function(p) {
    p.test = function() {
      alert("Test2");
    };
});

var FooChild2 = Lineage.define(ParentFoo, function(p) {
    p.test = function() {
      alert("Test3");
    };
});

|

你在那里混合了一些隐喻。你有三个选择:

  • 功能性
  • 简单的构造函数,每个实例重写(您试图做的事情)
  • 可重用原型遗传
功能的 听起来你喜欢Douglas Crockford喜欢的函数继承形式,它摒弃了原型,转而支持他所谓的“制造者”函数:

var f = makeFoo({
    test: function() {
        alert('Test2');
    }
});

var f1 = makeFoo({
    test: function () {
        alert('Test3');
    }
});

f.test();
f1.test();
…其中,
makeFoo
是:

function makeFoo(options) {
    return $.extend({}, makeFoo.defaults, options);
}
makeFoo.defaults = {
    test: function() {
        alert("Default test");
    }
};
|

我自己也不是一个超级粉丝,但是有很多人是,当然和大多数事情一样,它有优点和缺点。优点之一是它有多简单

简单构造函数,每个实例重写 但是你可以用构造函数来实现,就像你尝试过的那样;您可以将选项应用于此,而不是创建自己的单独对象:

function Foo(options) {
    $.extend(this, options);
}
Foo.prototype.test = function() {
    alert("Default test");
};

var f = new Foo({
    test: function() {
        alert("Test2");
    }
});

var f2 = new Foo({
    test: function() {
        alert("Test3");
    }
});

f.test();
f2.test();
|

可重用原型遗传 如果您想更进一步,并基于原型继承建立适当的层次结构(这样您就可以使用特定的覆盖
test
函数创建多个对象),有更多的管道工作要做,但您有一个优势,即调用“super”版本的函数可以非常直接。管道系统非常复杂,我使用了一个库来实现它,在我的例子中,我自己的库叫做,但Prototype有一个类似的库叫做,还有其他几个库

在执行原型继承时,您拥有构造函数,然后使用它们构造实例。对于
沿袭
,上述内容可能与此类似:

var ParentFoo = Lineage.define(function(p) {
    p.test = function() {
      alert("Default test");
    };
});

var FooChild1 = Lineage.define(ParentFoo, function(p) {
    p.test = function() {
      alert("Test2");
    };
});

var FooChild2 = Lineage.define(ParentFoo, function(p) {
    p.test = function() {
      alert("Test3");
    };
});

|

你只是被问题缠住了还是怎么了?这听起来有点像“为我工作”你只是被问题缠住了还是什么?这听起来有点像“为我做这项工作”