一个函数可以被认为类似于一个类吗?

时间:2011-11-16 20:46:02

标签: javascript c++

如果我有一个功能说:

var my_function = function()
  {
  }

如果没有调用该函数,它不占用内存,只是文本位于内存中。

但是,如果你通过说...

来称呼它
function_instance = new my_function();

它被实例化是一种方式,它包含的变量和方法被加载到内存中。

这是一种表示类似于C ++的类/对象模型的方法吗?

我的解释是否正确?

4 个答案:

答案 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中模拟传统类和继承的一些工作。你可以看看他的博客上有一个有趣的例子:

http://ejohn.org/blog/simple-javascript-inheritance/