将函数绑定到 JavaScript 继承层次结构中的原型

Binding a function to a prototype in a JavaScript inheritance hierarchy

本文关键字:层次结构 原型 继承 JavaScript 函数 绑定      更新时间:2023-09-26

我想做的是将序列化方法改造为现有的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的原型,但是如果我尝试将其直接绑定到Mammal,则什么也没发生。再一次,我发现自己超出了JavaScript的范围。

这样做的原因是将我所有的序列化/反序列化保存在一个地方,以便我需要它时它就在那里,但我并不总是必须包含它 - 我想在另一种语言中它可能表现得有点像混合。

我需要做什么来确保Mammal类型的实例上的任何serialise()调用将在当前实例的上下文中正确应用 Serialise.serialiseMammal() 函数?有没有办法在创建函数时不将函数绑定到单个实例的情况下执行此操作?

我也在努力提高自己对语言的专业知识,并以更多的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() 时,将在当下的上下文中调用该函数。这,this bob.serialise()内部,这是来自serialiseMammal的代码,设置为bob

这是对它的摆弄。http://jsfiddle.net/6un6qho1/1/