我在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 ++类“继承”的最佳方法是什么?
答案 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.