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;
}
你把隐喻混在一起了。你有三个选择:
- 功能性
- 简单的构造函数,每个实例重写(您试图做的事情)
- 可重用原型遗传
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");
};
});
|你在那里混合了一些隐喻。你有三个选择:
- 功能性
- 简单的构造函数,每个实例重写(您试图做的事情)
- 可重用原型遗传
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");
};
});
|你只是被问题缠住了还是怎么了?这听起来有点像“为我工作”你只是被问题缠住了还是什么?这听起来有点像“为我做这项工作”