实例化定制原型JavaScript函数(Instantiate JavaScript functio

2019-06-26 07:39发布

我用下面的函数来从参数数组创建的JavaScript函数实例:

var instantiate = function (instantiate) {
    return function (constructor, args, prototype) {
        "use strict";

        if (prototype) {
            var proto = constructor.prototype;
            constructor.prototype = prototype;
        }

        var instance = instantiate(constructor, args);
        if (proto) constructor.prototype = proto;
        return instance;
    };
}(Function.prototype.apply.bind(function () {
    var args = Array.prototype.slice.call(arguments);
    var constructor = Function.prototype.bind.apply(this, [null].concat(args));
    return new constructor;
}));

使用上述功能,您可以创建实例如下(见小提琴 ):

var f = instantiate(F, [], G.prototype);

alert(f instanceof F); // false
alert(f instanceof G); // true

f.alert(); // F

function F() {
    this.alert = function () {
        alert("F");
    };
}

function G() {
    this.alert = function () {
        alert("G");
    };
}

上面的代码适用于类似的用户内置构造F 。 然而,它并不像原生构造工作Array显而易见的安全原因。 您可以随时创建一个数组,然后改变其__proto__属性,但我使用犀牛此代码,这样就不会在那里工作。 是否有任何其他的方式来实现在JavaScript同样的结果?

Answer 1:

你不能完全继承数组 。

但是,你可以使用Object.create从当前的代码(去掉了很多复杂的前 )。



Answer 2:

我不认为你实现你在这里打算什么。 首先在你的F和G功能您在这个对象上定义警报功能。 这意味着每次你实例化一个新的函数对象将被创建并分配给提醒对象时。 这是不是你想要的,你需要在F和G的原型定义警报

function F() { }

F.prototype.alert = function() {
    alert("F");
};

function G() { }

G.prototype.alert = function() {
    alert("G");
};  

但是你仍然在你的实例化功能的问题。 如果你把它叫做你有办法

var f = instantiate(F, [], G.prototype);

所有你做的是设置F的原型G.prototype,这不是我想你想要的。 我假设,如果你实例化一个F对象,那么你会希望能够调用所有的对F.prototype定义的功能,但事情的方式受不了这种情况并非如此。

function F() { }

F.prototype.alert = function() {
    alert("F");
};

F.prototype.foo = function() {
    alert("F foo");
};

function G() { }

G.prototype.alert = function() {
    alert("G");
};  


var f = instantiate(F, [], G.prototype);
f.foo(); // error!

之所以在这里的错误是像我说你刚才分配F公司原型G.prototype和G.prototype没有一个foo的功能定义。

如果您正在寻找这样做的继承这种方式看看约翰Resig的博客,他有一个很好的implemantation: http://ejohn.org/blog/simple-javascript-inheritance/

此外道格拉斯克罗克福德已建立了一些很好的例子: http://www.crockford.com/javascript/inheritance.html



文章来源: Instantiate JavaScript functions with custom prototypes