gpt4 book ai didi

javascript - 想要扩展原型(prototype)方法

转载 作者:行者123 更新时间:2023-11-28 13:52:00 28 4
gpt4 key购买 nike

我有以下代码:

    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

编辑:我没有得到我在评论中写的内容作为输出。

最佳答案

你有点混合了隐喻。三种选择供您选择:

  • 功能性
  • 简单的构造函数,覆盖每个实例(您想要做的事情)
  • 可重用的原型(prototype)继承

功能性

听起来您喜欢 Douglas Crockford 喜欢的函数继承形式,这种形式消除了原型(prototype),转而支持他所谓的“制造者”函数:

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");
}
};

Live example | source

我自己并不是它的忠实粉丝,但是有很多人喜欢并且肯定喜欢大多数东西,它有优点也有缺点。优点之一是它非常简单。

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

但是你可以使用构造函数来做到这一点,就像你尝试过的那样;您将选项应用于 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();

Live example | source

可重用的原型(prototype)继承

如果您想更进一步并拥有基于原型(prototype)继承的适当层次结构(这样您就可以使用特定的覆盖 test 函数创建多个对象),则需要做更多的工作,但您已经这样做的优点是,调用“ super ”版本的函数之类的事情可以非常简单。管道非常复杂,我使用了一个库,在我的例子中,我自己的库名为 Lineage ,但 Prototype 有类似的东西,称为 Class还有其他几个。

在进行原型(prototype)继承时,您有构造函数,然后用它们构造实例。上面的 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");
};
});

Live example | source

关于javascript - 想要扩展原型(prototype)方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10194744/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com