Javascript中的一切都是一个对象:字符串、数组、值、函数等等,js中没有类概念。

但是我们可以使用js的语法特性来创建类的对象。

原始的方法
复制代码代码如下所示:


var obj =新的对象();
obj.name =曲; / /属性添加到一个对象
obj.age = 21;
(obj.showname =功能){ / /添加对象的方法
警报(这个名字);
}
obj.showage =函数(){
警戒(这个年龄);
}

Obj.showName(); / /曲
Obj.showAge(); / / 21



上面的方法通过新关键字生成一个对象,然后根据js的属性作为动态语言添加属性和方法。

创建一个对象,这是表示方法的对象。

这样的问题是,如果需要多次创建对象,则需要多次重复代码,而不是重用代码。

工厂方法
复制代码代码如下所示:


功能createobj(){
var obj =新(对象); / /创建对象

obj.name =曲;
obj.age = 21;
obj.showname =函数(){
警报(这个名字);
}
obj.showage =函数(){
警戒(这个年龄);
}

返回对象; / /返回对象
}

var obj1 = createobj();
var obj2 = createobj();

obj1.showname(); / /曲
obj2.showage(); / / 21



此方法改进代码重用、更改工厂方法,并引入参数分配。
复制代码代码如下所示:


功能createobj(姓名,年龄){ / /结构对象的初始化参数可以通过
var obj =新(对象); / /创建对象

obj.name =名称;
obj.age =年龄;
obj.showname =函数(){
警报(这个名字);
}
obj.showage =函数(){
警戒(这个年龄);
}

返回对象; / /返回对象
}

var obj1 = createobj(曲
var obj2 = createobj(罗

obj1.showname(); / /曲
obj1.showage(); / / 22
obj2.showname(); / /罗
obj2.showage(); / / 21



上述方法可以提高代码的可重用性,但与面向对象的概念相比,存在较大的缺陷。

对象的属性是私有的,对象的方法是共享的,而上面的工厂方法为每个对象创建一个对象。

对象创建自己的私有方法。同时,由于为每个对象创建相同的逻辑方法,这是对内存的浪费。
复制代码代码如下所示:


功能createobj(姓名,年龄){
var obj =新(对象); / /创建对象

obj.name =名称;
obj.age =年龄;
obj.showname = showName;
obj.showage = showage;

返回对象; / /返回对象
}

功能(showName){ / /作为一个函数对象
警报(这个名字);
}

功能showage(){
警戒(这个年龄);
}

var obj1 = createobj(曲
var obj2 = createobj(罗

obj1.showname(); / /曲
obj1.showage(); / / 22
obj2.showname(); / /罗
obj2.showage(); / / 21



通过定义一个函数对象,解决了由不同对象保存函数对象的私有问题。

一个包含上述两个函数的引用,但以这种方式,对象的函数是独立的,与对象无关。

特定对象的特定方法在某一特定类中的观点并不一致。

构造函数的方法
复制代码代码如下所示:


/ /定义一个构造函数,用于java构造函数生成相应的对象,类比
功能人(姓名,年龄){

当调用新的人/人时,在执行第一行代码之前,将MR放入一个人对象中,并将对象存储在内存中。
分配给该关键字的索引,这可以生成新对象这个关键字操作,如添加以下属性或方法

this.name =名称; / /这个关键词不能少。对当前对象的引用的对象的name属性的值,该关键字
实际上等于为当前对象添加name属性,然后它的name属性赋值。
this.age =年龄;

(this.showname =功能){ / /当前对象的方法
警报(这个名字);
}
this.showage =函数(){
警戒(这个年龄);
}

当前对象变量将返回到赋值符号的左边(不显式使用返回)
}

var obj1 =新的人(曲
var obj2 =新的人(罗

obj1.showname(); / /曲
obj1.showage(); / / 22
obj2.showname(); / /罗
obj2.showage(); / / 21



构造函数与工厂方法相同,为每个对象创建一个独占函数对象。当然,这些函数也可以使用。

对象在构造函数之外定义,以便对象和方法彼此独立。

原型方法:该方法使用的对象的原型属性
复制代码代码如下所示:
脚本类型文本>

函数(人)定义构造函数,不能传递参数。

该方法的所有属性都给出了原型属性。

person.prototype.name =曲; / /添加属性
Person.prototype.age = 22;

(person.prototype.showname =功能){ / /添加
警报(这个名字);
}

person.prototype.showage =函数(){
警戒(这个年龄);
}

var obj1 =新的(人); / /创建一个Person对象
var obj2 =新的人();

obj1.showname(); / /曲
obj1.showage(); / / 22
obj2.showname(); / /曲
obj2.showage(); / / 22



当生成人对象时,将原型的属性分配给新对象,然后共享属性和方法。

这个方法的问题是构造函数不能被引用,每个新生成的对象都有一个默认值。

任何问题,但财产共享是一个问题,当属性是一个可以改变状态的对象时。
复制代码代码如下所示:


函数(人)定义构造函数,不能传递参数。

person.prototype.age = 22;
person.prototype.array =新的阵列(曲

person.prototype.showage =函数(){
警戒(这个年龄);
}

person.prototype.showarray =函数(){
警报(这个数组);
}

var obj1 =新的(人); / /创建一个Person对象
var obj2 =新的人();

obj1.array.push(京); / /添加一个元素到obj1数组属性

obj1.showarray(); / /曲,罗,Kyo
obj2.showarray(); / /曲,罗,Kyo



在上面的代码中添加一个元素通过obj1 obj1属性的数组,对obj2 ARRA属性的元素也跟着元素。

原因是该obj1和obj2对象数组的属性是指同一个对象数组,然后将数组

对象,对数组对象的属性的其他引用自然会受到影响。

混合构造函数/原型模式

使用构造函数定义对象的属性,并使用原型(原型)来定义对象,这样就可以完成属性。

私有和方法共享。
复制代码代码如下所示:


功能人(姓名,年龄){
this.name =名称;
this.age =年龄;
this.array =新的阵列(曲
}

person.prototype.showname =函数(){
警报(这个名字);
}

person.prototype.showarray =函数(){
警报(这个数组);
}

var obj1 =新的人(曲
var obj2 =新的人(罗

obj1.array.push(京); / /添加一个元素到obj1数组属性

obj1.showarray(); / /曲,罗,Kyo
obj1.showname(); / /曲
obj2.showarray(); / /曲:罗
obj2.showname(); / /罗



属性是私有的之后,更改每个属性的属性不会影响其他对象,同时,该方法也由不同的对象共享,

这符合面向对象编程的要求。

动态原型方法
复制代码代码如下所示:


功能人(姓名,年龄){
this.name =名称;
this.age =年龄;
this.array =新的阵列(曲

如果在_initialized /未定义的人的对象,表明该方法尚未添加到人物原型
如果(类型的人。_initialized = =未定义)
{
person.prototype.showname =函数(){
警报(这个名字);
}

person.prototype.showarray =函数(){
警报(这个数组);
}

的人。_initialized = true; / /设置为true,不添加方法的原型
}
}

var obj1 =新的人(曲
var obj2 =新的人(罗

obj1.array.push(京); / /添加一个元素到obj1数组属性

obj1.showarray(); / /曲,罗,Kyo
obj1.showname(); / /曲
obj2.showarray(); / /曲:罗
obj2.showname(); / /罗



此方法与构造函数/原型相同,只需将方法添加到构造函数中并同时构建它。

属性被添加到函数中,以确保if语句只能成功执行一次。

在实际应用中应用最广泛的是构造函数/原型方法,动态原型技术也很流行,它是功能性的和结构化的。

函数/原型方法是等价的,不要单独使用构造函数或原型方法。