从 JavaScript 中的 C++ class 继承
Inheriting from a C++ class in JavaScript
我在 C++ 程序中使用 V8 进行扩展。我希望能够
在 C++ 中从基数 class 在 JavaScript 中创建对象 "inherit"。
这是 C++ 中的简单层次结构:
class animal
{
public:
void move();
virtual void vocalize() = 0;
};
class cat : public animal
{
public:
void vocalize() override;
void ignore_owner();
};
这是 cat
在 JavaScript 而不是 C++ 中实现的:
function cat()
{
this.vocalize = function() {}
this.ignore_owner = function() {}
}
add_animal(new cat);
其中add_animal()
是用C++实现的全局函数:
void add_animal(v8::Local<v8::Object> o);
在add_animal()
中,我手动添加了指向C++的move
属性
函数并确保 vocalize
属性 存在并且是一个
功能。
var c = new cat;
c.ignore_owner(); // JavaScript code
c.move(); // error, undefined
add_animal(c);
c.move(); // okay, C++ code
我在 JavaScript 网页之外的经验有限。这是一个
有意义的计划? add_animal()
用于两者的事实
添加 "base class" 属性 和 将动物添加到列表中
对我来说违反直觉。我可以添加第二个功能:
var c = new cat;
make_animal(c);
add_animal(c);
但这需要纪律并且看起来很复杂。
我还可以公开 animal
,用它来创建对象并添加
cat
-之后的特定属性:
function make_cat(c)
{
c.vocalize = function() {}
c.ignore_owner = function() {}
}
var c = new animal;
make_cat(c);
add_animal(c);
但这对我来说很奇怪。
从 C++ class 到 "inherit" 的最佳方法是什么?
只需将基础 class 暴露给 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.
我在 C++ 程序中使用 V8 进行扩展。我希望能够 在 C++ 中从基数 class 在 JavaScript 中创建对象 "inherit"。 这是 C++ 中的简单层次结构:
class animal
{
public:
void move();
virtual void vocalize() = 0;
};
class cat : public animal
{
public:
void vocalize() override;
void ignore_owner();
};
这是 cat
在 JavaScript 而不是 C++ 中实现的:
function cat()
{
this.vocalize = function() {}
this.ignore_owner = function() {}
}
add_animal(new cat);
其中add_animal()
是用C++实现的全局函数:
void add_animal(v8::Local<v8::Object> o);
在add_animal()
中,我手动添加了指向C++的move
属性
函数并确保 vocalize
属性 存在并且是一个
功能。
var c = new cat;
c.ignore_owner(); // JavaScript code
c.move(); // error, undefined
add_animal(c);
c.move(); // okay, C++ code
我在 JavaScript 网页之外的经验有限。这是一个
有意义的计划? add_animal()
用于两者的事实
添加 "base class" 属性 和 将动物添加到列表中
对我来说违反直觉。我可以添加第二个功能:
var c = new cat;
make_animal(c);
add_animal(c);
但这需要纪律并且看起来很复杂。
我还可以公开 animal
,用它来创建对象并添加
cat
-之后的特定属性:
function make_cat(c)
{
c.vocalize = function() {}
c.ignore_owner = function() {}
}
var c = new animal;
make_cat(c);
add_animal(c);
但这对我来说很奇怪。
从 C++ class 到 "inherit" 的最佳方法是什么?
只需将基础 class 暴露给 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.