微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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.

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

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

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

这是最干净的解决方案.

原文地址:https://www.jb51.cc/js/150423.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐