草庐IT

javascript - 需要模式 : create new object that returns an executeable function and inherits from a prototype

coder 2024-07-29 原文

场景 1 - 一切正常:

var AwesomeObject = function()
{
   var self = this;
   self.whatstuff = 'really awesome';
}

AwesomeObject.prototype.doStuff = function()
{
   var self = this;
   console.log('i did '+self.whatstuff+' stuff');
   return self;
}

var awesome = new AwesomeObject(); //returns a new AwesomeObject
awesome.doStuff(); // prints 'i did really awesome stuff' on the console

现在我想要它更棒:

var AwesomeObject = function()
{  
   var f = function() { console.log('i am awesome'); }
   var self = f;
   self.whatstuff = 'really awesome';
   return self;
}

AwesomeObject.prototype.doStuff = function()
{
   var self = this;
   console.log('i did '+self.whatstuff+' stuff');
   return self;
}

var awesome = new AwesomeObject(); //returns the interal f object
awesome(); // prints 'i am awesome'
awesome.doStuff(); // throws an error

新的 AwesomeObject 应该返回一个可执行函数本身,这样我就可以说'awesome();'

但我希望它也继承AwesomeObject.prototype

添加 self.prototype = AwesomeObject.prototype; 没有帮助。

var AwesomeObject = function()
{  
   var f = function() { console.log('i am awesome'); }
   var self = f;
   self.whatstuff = 'really awesome';
   self.prototype =  AwesomeObject.prototype;
   return self;
}

好的,我可以将 AwesomeObject.prototype 函数一个接一个地复制到 f 的范围内

var AwesomeObject = function()
{  
   var f = function() { console.log('i am awesome'); }
   var self = f;
   self.whatstuff = 'really awesome';
   self.doStuff =  function() { AwesomeObject.prototype.doStuff.apply(self,arguments); }
   return self;
}

但我认为一定有更好的方法、更好的模式,它是什么?

这个问题让我发疯,非常感谢帮助。

一般来说:如何创建一个函数对象

  • 可以创建新的
  • 返回一个可以执行的函数对象
  • 继承给定原型(prototype)的所有属性和方法

?

有办法吗?

谢谢 弗朗兹

最佳答案

一个非常简单的模式是工厂。

var AwesomeObject = (function() {
    var AwesomeObject = function() {
        this.whatstuff = 'really awesome';
    };

    AwesomeObject.prototype.doStuff = function() {
        console.log('i did ' + this.whatstuff + ' stuff');
        return this;
    };

    return function() {
        var o = new AwesomeObject();
        var f = function() { console.log("I am awesome"); };
        for (var k in o) {
            f[k] = o[k];    
        }

        return f;
    };

})();

var foo = AwesomeObject();
foo();
foo.doStuff();

Live Example .

这个想法是将函数和对象分成两部分。您的对象存在于函数的局部范围内,函数可以使用该对象。

对象本身完全通过原型(prototype)继承。

关键是将对象的所有属性/方法转发给函数。

这是最干净的解决方案。

关于javascript - 需要模式 : create new object that returns an executeable function and inherits from a prototype,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5895110/

有关javascript - 需要模式 : create new object that returns an executeable function and inherits from a prototype的更多相关文章

随机推荐