继承JavaScript中的C ++类

时间:2015-07-18 19:32:57

标签: javascript c++ inheritance v8

我在C ++程序中使用V8进行扩展。我希望能够 在JavaScript中创建“继承”C ++基类的对象。 这是C ++中的一个简单层次结构:

            //Only for testing
            var fakeCurrFuelDrive = fakeCurrFuel;

            //Check if the engine is running before calcualting burned lites
            if (data.Drivetrain.EngineRpm >= 50)
            {
                //Ensure variable has data
                if (drivenOldFuel == 0)
                {
                    //Set variable for next check
                    drivenOldFuel = fakeCurrFuelDrive;
                }

                //Distance travelled - refueling
                if ((drivenOldFuel - fakeCurrFuelDrive) < 0)
                {
                    drivenCurrentFuel = fuel + (fakeCurrFuelDrive - drivenOldFuel);
                }

                //Check for refueling
                if ((drivenOldFuel - fakeCurrFuelDrive) > 0)
                {
                    drivenCurrentFuel = fuel + (drivenOldFuel - fakeCurrFuelDrive);
                }

                //Set variable for next check
                drivenOldFuel = fakeCurrFuelDrive;
                fuel = drivenCurrentFuel;
            }

这是class animal { public: void move(); virtual void vocalize() = 0; }; class cat : public animal { public: void vocalize() override; void ignore_owner(); }; 在JavaScript而不是C ++中实现的:

cat

其中function cat() { this.vocalize = function() {} this.ignore_owner = function() {} } add_animal(new cat); 是用C ++实现的全局函数:

add_animal()

void add_animal(v8::Local<v8::Object> o); 中,我手动添加指向C ++的add_animal()属性 函数并确保move属性存在且是一个 功能

vocalize

我在网页之外的JavaScript体验有限。这是一个 有意义的计划? var c = new cat; c.ignore_owner(); // JavaScript code c.move(); // error, undefined add_animal(c); c.move(); // okay, C++ code 用于两者的事实 添加“基类”属性将动物添加到列表中 对我来说是违反直觉的。我可以添加第二个功能:

add_animal()

但这需要纪律,看起来很复杂。

我还可以公开var c = new cat; make_animal(c); add_animal(c); ,用它来创建对象并添加 animal - 之后的特定属性:

cat

但这对我来说很奇怪。

从C ++类“继承”的最佳方法是什么?

1 个答案:

答案 0 :(得分:0)

只需将您的基类公开给JavaScript(有关示例,请参阅the official embedder's guide),然后使用常规JavaScript继承:

function Cat(name) {
  this.name = name;
}
var catproto = Cat.prototype = new Animal();
catproto.vocalize = function() { /* cat-specific override */ }
catproto.ignore_owner = function() { return true; /* :-P */ }
catproto.purr = function() { /* you can add new methods too */ }

var c = new Cat("Kitty");
c.move();  // Inherited.
c.vocalize();  // Meow.