javascript – 需要的模式:创建返回可执行函数并从原型继承的新对象

前端之家收集整理的这篇文章主要介绍了javascript – 需要的模式:创建返回可执行函数并从原型继承的新对象前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
场景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;
}

但我认为必须有更好的方式,更好的模式,它是什么?

这个问题让我发疯,帮助真的很感激.

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

>可以用new创建
>返回可以执行的函数对象
>继承给定原型的所有属性方法

有办法吗?

谢谢
弗朗茨

解决方法

一个非常简单的模式是工厂.
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.

我们的想法是将您的功能和对象分成两部分.您的对象存在于函数的本地范围内,该函数可以使用该对象.

对象本身完全通过原型继承.

关键是将对象的所有属性/方法转发到函数上.

这是最干净的解决方案.

猜你在找的JavaScript相关文章