gpt4 book ai didi

javascript - 将自执行的 init 方法添加到构造函数?

转载 作者:行者123 更新时间:2023-11-29 14:48:17 24 4
gpt4 key购买 nike

假设我有一个我无权访问的构造函数。在这个构造函数中,我想注入(inject)一个自执行的 init 方法,只要从这个构造函数创建一个新实例,它就会执行

例如:假设有一个 Cat 构造函数,但不幸的是我无法访问它:

function Cat() {
// ...code which I do not have access to
// ...maybe it comes from an external file or something?
}

我现在当然可以这样做来创造新的猫:

var coolCat = new Cat();

一切顺利,我有了我的新猫实例。

但现在我想要的是(如果我实际上可以访问 Cat 构造函数主体,当然我没有!)像这样:

function Cat() {
this.roarOnInit = function() {
alert(’ROOOAAAR!’);
};
this.roarOnInit();
}

...所以当我这样做时:

var coolCat = new Cat();

......我真的得到了那个很酷的 ROAR-alert box!

我确实了解如何将方法 roarOnInit 添加到 Cat 构造函数(Cat.prototype.roarOnInit = function …)但是有没有一种方法可以轻松地将调用添加到方法(只要 Cat 实例被执行created) 到构造函数主体?

这似乎是一件微不足道的事情,而且可能非常简单,但我今天下午似乎无法解决这个问题!感谢您的耐心等待。

更新

感谢您到目前为止的回答!我确实忘记了一件非常重要的事情,那就是我不会事先知道构造函数是什么,或者它的名字等。这是因为我正在通过一个接受任何构造函数作为参数的函数运行它,并且最终返回构造函数(带有它的原始名称/原型(prototype))。

最佳答案

让我们从 Cat 的定义开始:

function Cat(name){
this.name=name;
}
Cat.prototype.meow=function(){alert(this.name)}

现在,我们可以做的是用一个返回常规 Cat 的新构造函数覆盖它,但仅在运行我们的脚本之后:

var oldCat = Cat;
function Cat(name){
var self=new oldCat(name);
self.roarOnInit=function(){alert("ROOOOAAARRR")};
self.roarOnInit();
return self;
}

我们现在可以执行 new Cat("Muffin"),它会咆哮,我们仍然可以访问原始 Cat 原型(prototype)链上的属性。我在示例片段中展示了这一点:

// just to be safe, define the original as oldCat()

function oldCat(name){
this.name=name;
}
oldCat.prototype.meow=function(){alert(this.name)}


//var oldCat = Cat;
function Cat(name){
var self=new oldCat(name);
self.roarOnInit=function(){alert("ROOOOAAARRR")};
self.roarOnInit();
return self;
}

var coolCat = new Cat("Muffin");
coolCat.meow();

现在,如果您想将 this 抽象为接受任何函数,并不难。我们只需要对构造函数做一些工作即可传递参数。 Javascript - Create instance with array of arguments

function injectToConstructor(C){
return function(){
var self = new (C.bind.apply(C,[C].concat([].slice.call(arguments))))();
console.log("object initiated:");
console.log(self);
return self;
};
}

然后我们可以这样做:

Cat = injectToConstructor(Cat);
var coolCat = new Cat("Muffin"); // logs 2 items
coolCat.meow();

关于javascript - 将自执行的 init 方法添加到构造函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29798336/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com