将对象方法设为香草JS

时间:2019-11-24 20:35:36

标签: javascript

说,我有一个名为Animal的构造函数,它有两个原型方法foobar

我创建了一个新对象:

const animal = new Animal()

我可以打电话给

animal.foo()

animal.bar()

我可以用另一种方法(baz替换这两种方法吗?

赞:

animal.baz()

因此,根据上下文,我想将foobar分配给baz

3 个答案:

答案 0 :(得分:1)

面向对象的方法是创建两个子类,每个子类一个。在每种方法中,您都需要定义baz方法,以分别将其参数分别传递给this.foothis.bar

您还可以使用baz在对象上动态定义animal.baz = Animal.<foo|bar>。但是,该策略的可维护性较低(每次实例化对象时都必须定义该策略),而性能较低(解释器针对具有不变属性的对象进行了优化)。

答案 1 :(得分:0)

不知道上下文的形式,您可以通过一种简单的方法将上下文(以任何形式)传递到构造函数中,并将其存储在对象中,然后调用baz时,检查存储的上下文并采取相应措施。这也很灵活:

// ES6
class Animal {
    constructor(context) {
        this.context = context;
    }
    foo() {
        ...
    }
    bar() {
        ...
    }
    baz() {
        if(context == "some string id maybe?") {
            return this.foo();
        } else if(context == 13523) { // some integer id
            return this.foo();
        } else if(context === someContextObject) { // some context object
            return this.bar();
        } else {
            return this.foo();
        }
    }
}

//Vanilla

const Animal = function(context) {
    this.context = context;
}
Animal.prototype.foo = function() {
    ...
}
Animal.prototype.bar = function() {
    ...
}
Animal.prototype.baz = function() {
    if(context == "some string id maybe?") {
        return this.foo();
    } else if(context == 13523) { // some integer id
        return this.foo();
    } else if(context === someContextObject) { // some context object
        return this.bar();
    } else {
        return this.foo();
    }
}

答案 2 :(得分:0)

像这样? :D

#include <iostream>
using namespace std;

int main()
{
    cout << "Hello World";
    return 0;
}