gpt4 book ai didi

javascript - 将函数绑定(bind)到 JavaScript 继承层次结构中的原型(prototype)

转载 作者:行者123 更新时间:2023-12-03 11:12:33 25 4
gpt4 key购买 nike

我想要做的是将序列化方法改进为现有的 JavaScript 类型,该类型是继承树的成员。它几乎可以工作,但我的函数是在父类型上运行的,而不是我试图将其关联的类型。举一个非常基本的例子:

function Animal( species, population ) 
{
this.species = species;
this.population = population;
}

Animal.prototype.getDetail = function()
{
return "Species: "+this.species+" Population: "+this.population;
}

function Mammal( species, population, bodyTemperature )
{
Animal.apply(this, [species, population]);
this.bodyTemperature = bodyTemperature;
}
Mammal.prototype= new Animal();
Mammal.constructor = Mammal;

var Serialise= {
init: function() {
Mammal.prototype.serialise = this.serialiseMammal.bind(Mammal.prototype);
},

serialiseMammal: function() {
return {
species: this.species,
population: this.population,
bodyTemperature: this.bodyTemperature
};
}
}

Serialise.init();

var bob = new Mammal("Human", 7000000000, 36.6);

console.log( bob.serialise() );

发生的事情是 serialise 函数在 Animal 类型的上下文中运行,这是正确的,因为这是 Mammal 的原型(prototype)>,但如果我尝试将其直接绑定(bind)到Mammal,则什么也不会发生。我再一次发现自己超出了 JavaScript 范围的深度。

我这样做的原因是为了将所有序列化/反序列化保存在一个地方,这样如果我需要它,它就在那里,但我并不总是必须将它包括在内 - 我想在另一种语言中它可能是行为有点像 mixin。

我需要做什么才能确保对 Mammal 类型的实例调用 serialise() 能够正确应用 Serialise.serialiseMammal ()函数在当前实例的上下文中?有没有一种方法可以做到这一点,而无需在创建函数时将函数绑定(bind)到单个实例?

我也在努力提高我自己对这门语言的专业知识,并以更多 JavaScript 的方式做事,所以如果整个方法完全怪异或违背该语言的本质,那会很高兴知道。

最佳答案

我不完全理解为什么你想以这种方式装饰它,而不是直接将专门的 serialiseMammal 直接放在 Mammal.prototype 上,如下所示:

Mammal.prototype.s2 = function() {
return {
species: this.species,
population: this.population,
bodyTemperature: this.bodyTemperature
};
};

我将其命名为s2,以免发生冲突。这与 serialiseMammal 中的代码相同。但是,如果您更喜欢所使用的装饰器风格模式,那么您只需执行以下操作:

var Serialise= {
init: function() {
Mammal.prototype.serialise = this.serialiseMammal;
},

serialiseMammal: function() {
return {
species: this.species,
population: this.population,
bodyTemperature: this.bodyTemperature
};
}
}

init 的上下文中,this 引用 Serialise,因此 this.serialiseMammal 是函数你有。但这只是一个功能,仅此而已。当您下次调用 bob.serialise() 时,该函数将在当前上下文中调用。 bob.serialise() 内的 this(来自 serialiseMammal代码)设置为 鲍勃

这是一个摆弄它的地方。 http://jsfiddle.net/6un6qho1/1/

关于javascript - 将函数绑定(bind)到 JavaScript 继承层次结构中的原型(prototype),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27504164/

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