Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oop 使用extend()和include()函数向类添加属性_Oop_Javascript_Javascript Framework - Fatal编程技术网

Oop 使用extend()和include()函数向类添加属性

Oop 使用extend()和include()函数向类添加属性,oop,javascript,javascript-framework,Oop,Javascript,Javascript Framework,有人能给我解释一下下面的代码中发生了什么吗?我理解include()和exclude()的含义,但是我们何时以及为什么要使用特定的函数呢 var Class=函数(){ var klass=函数(){ this.init.apply(this,arguments); }; klass.prototype.init=函数(){}; klass.fn=klass.prototype; //访问类的快捷方式 klass.fn.parent=klass;//我们在哪里使用它? //添加类属性 klass

有人能给我解释一下下面的代码中发生了什么吗?我理解include()和exclude()的含义,但是我们何时以及为什么要使用特定的函数呢

var Class=函数(){
var klass=函数(){
this.init.apply(this,arguments);
};
klass.prototype.init=函数(){};
klass.fn=klass.prototype;
//访问类的快捷方式
klass.fn.parent=klass;//我们在哪里使用它?
//添加类属性
klass.extend=函数(obj){
var extended=obj.extended;//这里发生了什么?
用于(obj中的var i){
klass[i]=obj[i];
}
if(extended)extended(klass)//不理解这部分
};
//添加实例属性
klass.include=功能(obj){
包含的var=包含的obj;/??
用于(obj中的var i){
klass.fn[i]=obj[i];/??
}
如果(包括)包括(klass)/??
};
返回克拉斯;
};
var Person=新类;//这与:var Person=new Class()相同;
他是从他那里得到的。目的是演示如何实现Javascript类,以及如何使用适当的模块化和继承。作者的解释非常抽象,没有具体说明是否使用了Prototype.js之类的库

我认为这个问题的一个好补充是:

  • 这一切看起来都像本地Javascript吗
  • Javascript的extend/extended和include/included是本机方法吗

在您的问题块作者给我们这一部分后:

Person.extend({
    extended: function(klass) {
        console.log(klass, " was extended");
    }
});

因此,如果我们在一个参数对象中有一个“扩展”属性,我们称它为。

想提供我对它的理解。我将把它分成两部分:定义和实现(或使用)。 按照您上面引用的定义,我将添加用法作为此代码:

var Person = new Class;

Person.extend({
    find: function(id) { /* definition */
    },
    exists: function(id) { /* definition */
    }
});
Person.include({
    save: function(id) { /* definition */
    },
    destroy: function(id) { /* definition */
    }
});

var person_e = Person.find(1);
var person_e = Person.exists(2);

var person = new Person;
person.save();
person.destroy(2);
请参见此代码与上一代码的连续性。 我试着列举发生了什么:

  • 类设置为保存函数定义。它还没有执行-所以类指向内存中写入函数定义的块
  • var Person=new Class->这相当于“new Class()”-所以类的执行发生了,结果被分配给Person。因为它是用“new”关键字调用的,“this”被分配给类的新实例
  • 现在,类()中发生了什么?(i) klass被设置为函数(当调用时,其作业是初始化“this”),但尚未执行。(ii)在klass的原型上定义了初始属性;init属性被设置为一个空函数(稍后我们将根据我们将定义的类覆盖它)(iii)klass上的extend和include属性的一些更奇特的东西(iv)和klass被返回->klass在此时保存函数定义。因此,调用“new Class()”将返回一个名为“klass”的函数,该函数在调用时对“this”执行初始化
  • 在这一点上,用外行的话来说,这个人可以被认为持有“函数klass()”。因此,Person.extend可以被认为是代码的klass.extend部分。extend是一个需要对象的函数。这个对象有键值对,键值是实用程序/函数的名称,值是函数定义。在'for'语句中,我们是这样做的(obj中的变量i)-因此'i'包含键-当我们执行'klass.fn[i]时,我们指的是klass.prototype.save或klass.prototype.destroy-因为下标[i]与点符号(命名空间)相同。我们知道,添加到klass.prototype的方法可用于Person实例,而不是作为属性添加到Person上
  • 我们调用new Person()-实际上,我们正在执行klass,因为Person在这个时间点持有klass,并且由于new被附加,所以“this”被传递。现在,在'klass'内部,初始化发生在'this'(通过应用形式)->的init属性上,我们刚刚覆盖了这个'init'属性

    klass.fn.parent=klass//我们在哪里使用它//不在哪里


  • 您是从
    Prototype.js
    获得的吗?如果您知道这段代码何时可以解决特定的问题,那么掌握或理解这段代码并不复杂。只有一个问题:
    您希望此代码做什么?