1

我正在学习 Javascript 中的 OOP,我遇到了第一个示例,我不清楚第三行的作用 ==> this.init.apply(this, arguments);

var Class = function(arguments){
    var klass = function(){
        this.init.apply(this, arguments);
    };
    klass.prototype.init = function(){};
    return klass;
};

还有人介意解释整个事情吗?我了解其中的大部分内容,但我只是想感觉自己正在以正确的方式思考这个问题。

4

1 回答 1

2

Javascript具有原型继承。您粘贴的代码有一个名为 init 的方法,声明为

类.prototype.init = ...

就像任何 klass 对象副本的公共方法一样。在 Javascript 中,每个对象都链接到一个名为“原型”的特殊对象。您放入该特殊对象的所有内容都可以访问原始对象的新实例。

例子:

var Human = function(n){
    this.name = n;
};
Human.prototype.getName = function(){
   return this.name;
};

//instance of Human
var pedro = new Human("Pedro");

现在 pedro 可以访问 Human.prototype 对象...

pedro.getName();
//return "Pedro"

pedro 原型从 Human.prototype “继承”,而 Human.prototype 从 Object.prototype “继承”。

让我们回到你的例子:

每个 klass 副本除了拥有自己的原型外,还会与 klass 原型相关联。所以每个 klass 副本(在这种情况下:Class 返回的每个对象)都将能够使用原始 klass 原型中定义的函数。

klass 是一个对象(函数是 js 中的对象),封装在另一个名为 Class 的对象/函数的定义中。

类生成 klass 的实例,因为这是 Class 函数返回的。

此代码说明了一种定义伪类“Class”的方法,该方法使用名为 init 的方法,可从函数 Class 返回的任何对象访问

这样你可以这样做:

var myClass = new Class(anArrayWithArguments);

在函数klass的上下文中:Class内部的“this”表示klass对象,this可以调用init,myClass可以像Class函数返回的新实例一样调用。

init 在您的示例中可以被视为构造函数。

从 init 调用的 apply 允许在对象 this (由 Class 返回的新对象)上使用一组参数调用 init

于 2013-06-29T02:37:08.380 回答