如果我有一个功能说:
var my_function = function()
{
}
如果没有调用该函数,它不占用内存,只是文本位于内存中。
但是,如果你通过说...
来称呼它function_instance = new my_function();
它被实例化是一种方式,它包含的变量和方法被加载到内存中。
这是一种表示类似于C ++的类/对象模型的方法吗?
我的解释是否正确?
答案 0 :(得分:3)
在javascript中,类概念不存在。一切都是对象。使用new运算符时,它会将该函数的原型复制到新对象中。换句话说,你可以模仿c ++中哪些类可以做,但它不是一个类。
答案 1 :(得分:1)
在JavaScript中,通过创建函数来定义新类。该函数可能包含其他函数(方法),属性等。
当使用新操作调用函数时,该函数将成为该类的构造函数。在构造函数内部,创建变量“this”并指向对象。
function Man(){
this.name = 'John';
}
var person = new Man;
console.log(person.name);
答案 2 :(得分:1)
“表示类似于C ++ 的类/对象模型的方法”将通过使用原型。
正如Kevin M指出的那样,您可以使用this
关键字在函数中创建实例变量,如下所示:
var my_function(foo)
{
this.foo = foo;
this.bar = function()
{
// bar-ing here
}
}
但问题是,无论何时实例化my_function()
,都会创建my_function.bar
函数的新实例。输入prototype
s:
var barPrototype = { "bar" : function()
{
// bar-ing here
}
};
var my_function(foo)
{
this.foo = foo;
}
my_function.prototype = barPrototype;
因此,总而言之,prototype
关键字可用于创建与C ++的成员函数类似的特定于函数的可继承属性。 C ++的成员函数没有为类的每个实例实例化。相反,编译器会为函数的参数添加一个this
指针; this指针指向调用成员函数的实例。
更多有趣的事情:http://javascript.infogami.com/Javascript_in_Ten_Minutes
答案 3 :(得分:0)
如上所述,Javascript函数可以充当对象,因此Javascript可以是面向对象的,但是对象继承是典型的,而不像C ++。 jQuery的创建者John Resig已经完成了在javascript中模拟传统类和继承的一些工作。你可以看看他的博客上有一个有趣的例子: