希望扩展原型方法

Roc*_*ngh 0 javascript jquery

我有以下代码:

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

    function Foo(options) {
        o = $.extend({}, defaults, options);
        Foo.prototype.test = o.test;
    }
    Foo.prototype.test = defaults; 
Run Code Online (Sandbox Code Playgroud)

我希望测试方法应该是可扩展的,我希望它可以用作:

    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
Run Code Online (Sandbox Code Playgroud)

编辑:我没有得到我在评论中写的输出.

T.J*_*der 5

你有点混淆隐喻.三种选择:

  • 实用
  • 简单的构造函数,覆盖每个实例(你试图做的)
  • 可重复使用的原型继承

实用

听起来你喜欢道格拉斯·克罗克福德喜欢的功能继承形式,它取消了原型,支持他所谓的"制造者"功能:

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

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

f.test();
f1.test();
Run Code Online (Sandbox Code Playgroud)

......在哪里makeFoo:

function makeFoo(options) {
    return $.extend({}, makeFoo.defaults, options);
}
makeFoo.defaults = {
    test: function() {
        alert("Default test");
    }
};
Run Code Online (Sandbox Code Playgroud)

实例 | 资源

我自己并不是一个忠实的粉丝,但是有很多人当然也喜欢大多数东西,它有优点和缺点.其中一个优点是它有多简单.

简单的构造函数,覆盖每个实例

但你可以使用构造函数来完成它,就像你尝试过的那样; 您应用选项this而不是创建自己的单独对象:

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();
Run Code Online (Sandbox Code Playgroud)

实例 | 资源

可重复使用的原型继承

如果你想进一步拥有基于原型继承的适当层次结构(所以你可以使用特定的覆盖test函数创建多个对象),那么还有更多的管道要做,但你有一个好处,就是做一些事情,比如调用"超级" "函数的版本可以非常简单.管道是非常复杂的,我使用一个库,在我的情况下,我自己的库被调用Lineage,但Prototype有类似的东西叫,Class而且还有其他几个.

在进行原型继承时,您有构造函数,然后使用它们构造实例.以上可能看起来像这样Lineage:

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");
    };
});
Run Code Online (Sandbox Code Playgroud)

实例 | 资源