在闭包外继承 javascript 函数原型
inherit javascript function prototype outside it closure
我正在使用 JavaScript 原型链接技术来链接函数,如下所示:
var foo = (function () {
function fn(arg) {
if (!(this instanceof fn)) {
return new fn(arg);
}
this.arg = arg;
return this;
}
var func = function (element) {
return fn(element);
};
fn.prototype = {
bar: function () {
return this;
}
}
func.functions = fn;
return func;
}());
我想知道如何访问 fn.prototype
以便我可以在其闭包之外向 foo
原型添加更多功能。
如果我只是简单地做如下,是行不通的:
foo.prototype.baz = function () {
alert(this.arg);
}
foo("hello").baz();
但是,如果 fn
分配给 foo
(func.functions = fn;
),如 foo
私有闭包中所示,我可以按照以下步骤操作,它会起作用:
foo.functions.prototype.baz = function () {
alert(this.arg);
}
foo("hello").baz();
还有其他方法可以实现吗?
我认为你没有必要把这个复杂化。你可以通过简单地这样做来链接:
const foobar = function(){return this} // Initialize a new Object
const foo = text => {
const me = new foobar()
me.text = text
me.bar = a => (alert(me.text+": "+a), me)
return me
}
foo('A').bar('Test').bar('Test chained')
// Update the foobar class with baz
foobar.prototype.baz = function() {alert('BAZ worked!');return this}
foo('B').bar('1').baz().bar('2')
注:点击Run code snippet
查看输出
就是这样!
编辑:
您也可以使用 ES6 类 执行此操作,例如:
class foobar {
constructor(text) {
this.text = text;
}
bar(a) {alert(this.text+": "+a);return this}
}
const foo = text => new foobar(text)
foo('A').bar('Test').bar('Test chained')
// Update the foobar class with baz
foobar.prototype.baz = function() {alert('BAZ worked!');return this}
foo('B').bar('1').baz().bar('2')
我正在使用 JavaScript 原型链接技术来链接函数,如下所示:
var foo = (function () {
function fn(arg) {
if (!(this instanceof fn)) {
return new fn(arg);
}
this.arg = arg;
return this;
}
var func = function (element) {
return fn(element);
};
fn.prototype = {
bar: function () {
return this;
}
}
func.functions = fn;
return func;
}());
我想知道如何访问 fn.prototype
以便我可以在其闭包之外向 foo
原型添加更多功能。
如果我只是简单地做如下,是行不通的:
foo.prototype.baz = function () {
alert(this.arg);
}
foo("hello").baz();
但是,如果 fn
分配给 foo
(func.functions = fn;
),如 foo
私有闭包中所示,我可以按照以下步骤操作,它会起作用:
foo.functions.prototype.baz = function () {
alert(this.arg);
}
foo("hello").baz();
还有其他方法可以实现吗?
我认为你没有必要把这个复杂化。你可以通过简单地这样做来链接:
const foobar = function(){return this} // Initialize a new Object
const foo = text => {
const me = new foobar()
me.text = text
me.bar = a => (alert(me.text+": "+a), me)
return me
}
foo('A').bar('Test').bar('Test chained')
// Update the foobar class with baz
foobar.prototype.baz = function() {alert('BAZ worked!');return this}
foo('B').bar('1').baz().bar('2')
注:点击Run code snippet
查看输出
就是这样!
编辑:
您也可以使用 ES6 类 执行此操作,例如:
class foobar {
constructor(text) {
this.text = text;
}
bar(a) {alert(this.text+": "+a);return this}
}
const foo = text => new foobar(text)
foo('A').bar('Test').bar('Test chained')
// Update the foobar class with baz
foobar.prototype.baz = function() {alert('BAZ worked!');return this}
foo('B').bar('1').baz().bar('2')