9159金沙游艺场

9159金沙游艺场 3
JS核心系列:浅谈 原型对象和原型链

U盘内容被病毒隐藏的解决办法(亲测可用)

JS中类或对象的定义说明

浅谈 JS 创建对象的 8 种模式

2015/10/16 · JavaScript
· 对象

原文出处: Tomson   

  • Objct 模式
  • 工厂模式
  • 构造器模式
  • 通过 Function 对象实现
  • prototype 模式
  • 构造器与原型方式的混合模式
  • 动态原型模式
  • 混合工厂模式

关于javascript中类的继承可以参考阮一峰的Blog《Javascript继承机制的设计思想》,说的很透。

我们知道,JS是面向对象的。谈到面向对象,就不可避免的要涉及类的概念。一般像c#,java这些强类型语言都有固定的定义类的语法。而JS的不同之处在于它能使用各种方法实现自己的类和对象。一般的实现有以下几种方式:

1.Object 模式

JavaScript

var o1 = {};//字面量的表现形式 var o2 = new Object; var o3 = new
Object(); var o4 = new Object(null); var o5 = new Object(undefined); var
o6 = Object.create(Object.prototype);//等价于 var o = {};//即以
Object.prototype 对象为一个原型模板,新建一个以这个原型模板为原型的对象
//区别 var o7 = Object.create(null);//创建一个原型为 null 的对象

1
2
3
4
5
6
7
8
var o1 = {};//字面量的表现形式
var o2 = new Object;
var o3 = new Object();
var o4 = new Object(null);
var o5 = new Object(undefined);
var o6 = Object.create(Object.prototype);//等价于 var o = {};//即以 Object.prototype 对象为一个原型模板,新建一个以这个原型模板为原型的对象
//区别
var o7 = Object.create(null);//创建一个原型为 null 的对象

在 chrome 里查看各个新建对象的区别:
图片 1

可以看出前6种模式创建出来的对象都是一样的,第七种不同点在于其虽然也为
Object
对象但其无任何属性(包括没有任何可以继承的属性,因为创建的时候没有指定其原型)

一、在javascript中实例化遇到的问题:

1.工厂方式 工厂方式是指创建一个返回特定对象类型的工厂函数,示例代码如下:

2.工厂模式

JavaScript

//工厂方法1 通过一个方法来创建对象 利用 arguments
对象获取参数设置属性(参数不直观,容易出现问题) function createCar(){ var
oTemp = new Object(); oTemp.name =
arguments[0];//直接给对象添加属性,每个对象都有直接的属性 oTemp.age =
arguments[1]; oTemp.showName = function () { alert(this.name);
};//每个对象都有一个 showName 方法版本 return oTemp; }
createCar(“tom”).showName();//在 JS 中没有传递的实参,实际形参值为
undefined(这里的 age 为 undefined) createCar(“tim”,80).showName();
alert(createCar(“tom”) instanceof Object);//true 判断对象是否 Object
类或子类

1
2
3
4
5
6
7
8
9
10
11
12
13
//工厂方法1 通过一个方法来创建对象 利用 arguments 对象获取参数设置属性(参数不直观,容易出现问题)
function createCar(){
    var oTemp = new Object();
    oTemp.name = arguments[0];//直接给对象添加属性,每个对象都有直接的属性
    oTemp.age = arguments[1];
    oTemp.showName = function () {
        alert(this.name);
    };//每个对象都有一个 showName 方法版本
    return oTemp;
}
createCar("tom").showName();//在 JS 中没有传递的实参,实际形参值为 undefined(这里的 age 为 undefined)
createCar("tim",80).showName();
alert(createCar("tom") instanceof Object);//true 判断对象是否 Object 类或子类

JavaScript

//工厂方法2 通过传参设置属性(参数直观明了) function createCar(name,age){
var oTemp = new Object(); oTemp.name =
name;//直接给对象添加属性,每个对象都有直接的属性 oTemp.age = age;
oTemp.showName = function () { alert(this.name); };//每个对象都有一个
showName 方法版本 return oTemp; } createCar(“tom”).showName();
createCar(“tim”,80).showName(); alert(createCar(“tom”) instanceof
Object);//true 判断对象是否 Object 类或子类

1
2
3
4
5
6
7
8
9
10
11
12
13
//工厂方法2 通过传参设置属性(参数直观明了)
function createCar(name,age){
    var oTemp = new Object();
    oTemp.name = name;//直接给对象添加属性,每个对象都有直接的属性
    oTemp.age = age;
    oTemp.showName = function () {
        alert(this.name);
    };//每个对象都有一个 showName 方法版本
    return oTemp;
}
createCar("tom").showName();
createCar("tim",80).showName();
alert(createCar("tom") instanceof Object);//true 判断对象是否 Object 类或子类

下面用《javascript高级程序设计》中的例子来做说明,假如现在定义了一个car的对象,它是Object类的实例。像下面这样的:

复制代码 代码如下:

3.构造器模式

JavaScript

//构造器方法1 function Car(sColor,iDoors){
//声明为构造器时需要将函数名首字母大写 this.color = sColor;
//构造器内直接声明属性 this.doors = iDoors; this.showColor = function(){
return this.color; };//每个 Car 对象都有自己的 showColor方法版本
this.showDoor = function () { return this.doors; } }

1
2
3
4
5
6
7
8
9
10
11
//构造器方法1
function Car(sColor,iDoors){  //声明为构造器时需要将函数名首字母大写
    this.color = sColor;      //构造器内直接声明属性
    this.doors = iDoors;
    this.showColor = function(){
        return this.color;
    };//每个 Car 对象都有自己的 showColor方法版本
    this.showDoor = function () {
        return this.doors;
    }
}

使用方法1的问题很明显,没办法是 showDoor
方法重用,每次新建一个对象就要在堆里新开辟一篇空间.改进如下

JavaScript

//构造器方法2 function showDoor(){ //定义一个全局的 Function 对象 return
this.doors; } function Car(sColor,iDoors){//构造器 this.color = sColor;
//构造器内直接声明属性 this.doors = iDoors; this.showColor = function(){
return this.color; }; this.showDoor = showDoor();//每个 Car
对象共享同一个 showDoor 方法版本(方法有自己的作用域,不用担心变量被共享)
} alert(new
Car(“red”,2).showColor());//通过构造器创建一个对象并调用其对象方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
//构造器方法2
function showDoor(){      //定义一个全局的 Function 对象
    return this.doors;
}
 
function Car(sColor,iDoors){//构造器
    this.color = sColor;      //构造器内直接声明属性
    this.doors = iDoors;
    this.showColor = function(){
        return this.color;
    };
    this.showDoor = showDoor();//每个 Car 对象共享同一个 showDoor 方法版本(方法有自己的作用域,不用担心变量被共享)
}
 
alert(new Car("red",2).showColor());//通过构造器创建一个对象并调用其对象方法

上面出现的问题就是语义不够清除,体现不出类的封装性,改进为 prototype 模式

复制代码 代码如下:

function createCar(sColor,iDoors,iMpg)
{
   var oTempCar=new Object;
   oTempCar.color=sColor;
   oTempCar.doors=iDoors;
   oTempCar.mpg=iMpg;
   oTempCar.showColor=function()
   {
        alert(this.color);
   }
   return oTempCar;
}
var oCar1=createCar(“red”,4,23);
var oCar2=createCar(“blue”,3,25);
oCar1.showColor();
oCar2.showColor();

4.通过Function对象实现创建对象

我们知道每声明一个函数实际是创建了一个Function 实例 JS
函数.

JavaScript

function function_name(param1,param2){alert(param1);} //等价于 var
function_name = new Function(“param1″,”pram2″,”alert(param1);”);

1
2
3
function function_name(param1,param2){alert(param1);}
//等价于
var function_name = new Function("param1","pram2","alert(param1);");

JavaScript

var Car2 = new Function(“sColor”,”iDoors”, “this.color = sColor;”+
“this.doors = iDoors;”+ “this.showColor = function(){ return this.color;
}” ); alert(new Car2(“blue”,3).showColor());

1
2
3
4
5
6
var Car2 = new Function("sColor","iDoors",
         "this.color = sColor;"+
         "this.doors = iDoors;"+
         "this.showColor = function(){ return this.color; }"
);
alert(new Car2("blue",3).showColor());

var oCar=new Object();
oCar.color = “red”;
oCar.doors = 4;
oCar.mpg = 23;
oCar.showColor = function () {
alert(this.color);
};

这种方式每次调用它的工厂函数,都会创建一个新对象。可问题在于每次生成一个新对象,都要创建新函数showColor,这使得每个对象都有自己的showColor版本,而事实上,所有的对象都共享同一个函数.为解决这个问题,开发者在工厂函数的外面定义了对象的方法,然后赋予对象一个指针指向这个这个函数,如下

5.prototype模式

  • 类通过 prototype 属性添加的属性与方法都是绑定在这个类的 prototype
    域(实际为一个 Prototype
    对象)中,绑定到这个域中的属性与方法只有一个版本,只会创建一次.
  • 类的实例对象可以直接像调用自己的属性一样调用该类的 prototype
    域中的属性与方法,类可以通过调用 prototype 属性来间接调用prototype
    域内的属性与方法.

注意:通过类实例化出对象后对象内无 prototype
属性,但对象可直接像访问属性一样的访问类的 prototype
域的内容,实例对象有个私有属性__proto__,__proto__属性内含有类的
prototype 域内的属性与方法

JavaScript

方法1 function Car3(){}//用空构造函数设置类名 Car3.prototype.color =
“blue”;//每个对象都共享相同属性 Car3.prototype.doors = 3;
Car3.prototype.drivers = new Array(“Mike”,”John”);
Car3.prototype.showColor = function(){ alert(this.color);
};//每个对象共享一个方法版本,省内存。 var car3_1 = new Car3(); var
car3_2 = new Car3(); alert(car3_1.color);//blue
alert(car3_2.color);//blue alert(Car3.prototype.color);//blue
car3_1.drivers.push(“Bill”);
alert(car3_1.drivers);//”Mike”,”John”,”Bill”
alert(car3_2.drivers);//”Mike”,”John”,”Bill”
alert(Car3.prototype.drivers);//”Mike”,”John”,”Bill”
//直接修改实例对象的属性,解析器会先去找实例对象是否有这个属性(不会去找实例对象的
_proto_ 属性内的那些类的 prototype
属性,而是直接查看这个实例是否有对应的属性(与_proto_同级))
//如果没有则直接给这个实例对象添加该属性,但不会修改类的prototype域的同名属性,既实例对象的_proto_属性内的那些类
prototype 域属性不会被修改 car3_1.color = “red”;//car3_1对象内无名为
color 的对象属性,故将该属性添加到该对象上
//解析器对实例对象读取属性值的时候会先查找该实例有无同名的直接属性
//如果没有,则查找__proto__属性内保存的那些 当前类的 prototype
域的属性 //有就返回,无则继续查找是否有原型链中的对应的方法属性
//有就返回,无则返回undefined alert(car3_1.color);//red
alert(car3_2.color);//blue alert(car3_2.color2);//undefined
//直接修改类的 prototype
域内的属性,不会影响该类的实例对象的对象属性,但会影响实例对象的_proto_属性(_proto_属性内存放的是类的
prototype 域的内容) Car3.prototype.color = “black”;
alert(car3_1.color);//red
该对象有同名的直接属性,故不会去_proto_属性内查找类的 prototype
域的属性 alert(car3_2.color);//black 受影响
//直接修改实例对象的方法,解析器会先去找实例对象是否有这个方法(不会去找实例对象的
_proto_ 属性内的那些类的 prototype
域的方法,而是直接查看这个实例是否有对应的方法(与_proto_同级))
//如果没有则直接给这个实例对象添加该方法,但不会修改类的prototype域的同名方法,既实例对象的_proto_属性内的那些类
prototype 域方法不会被修改 //car3_1对象内无名为 showColor
的对象方法属性,故将该方法属性添加到该对象上 car3_1.showColor =
function () { alert(“new function”); }
//解析器对实例对象调用方法属性的时候会先查找该实例有无同名的直接方法属性
//如果没有,则查找_proto_属性内保存的那些 当前类的 prototype
域的方法属性 //有就返回,无则继续查找是否有原型链中的对应的方法属性
//找到就返回,无则报错 car3_1.showColor();//new function
car3_2.showColor();//blue car3_1.abcd();//直接报错 //直接修改类的
prototype
域内的方法属性,不会影响该类的实例对象的方法属性,但会影响实例对象的_proto_属性(_proto_属性内存放的是类的
prototype 域的内容) Car3.prototype.showColor = function () {
alert(“second function”); } car3_1.showColor();//new function
该对象有同名的方法属性,故不会去_proto_属性内查找类的 prototype
域的方法属性 car3_2.showColor();//second function 受影响

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
方法1
function Car3(){}//用空构造函数设置类名
Car3.prototype.color = "blue";//每个对象都共享相同属性
Car3.prototype.doors = 3;
Car3.prototype.drivers = new Array("Mike","John");
Car3.prototype.showColor = function(){
    alert(this.color);
};//每个对象共享一个方法版本,省内存。
 
var car3_1 = new Car3();
var car3_2 = new Car3();
 
alert(car3_1.color);//blue
alert(car3_2.color);//blue
alert(Car3.prototype.color);//blue
 
car3_1.drivers.push("Bill");
alert(car3_1.drivers);//"Mike","John","Bill"
alert(car3_2.drivers);//"Mike","John","Bill"
alert(Car3.prototype.drivers);//"Mike","John","Bill"
 
//直接修改实例对象的属性,解析器会先去找实例对象是否有这个属性(不会去找实例对象的 _proto_ 属性内的那些类的 prototype 属性,而是直接查看这个实例是否有对应的属性(与_proto_同级))
//如果没有则直接给这个实例对象添加该属性,但不会修改类的prototype域的同名属性,既实例对象的_proto_属性内的那些类 prototype 域属性不会被修改
car3_1.color = "red";//car3_1对象内无名为 color 的对象属性,故将该属性添加到该对象上
 
//解析器对实例对象读取属性值的时候会先查找该实例有无同名的直接属性
//如果没有,则查找__proto__属性内保存的那些 当前类的 prototype 域的属性
//有就返回,无则继续查找是否有原型链中的对应的方法属性
//有就返回,无则返回undefined
alert(car3_1.color);//red
alert(car3_2.color);//blue
alert(car3_2.color2);//undefined
 
//直接修改类的 prototype 域内的属性,不会影响该类的实例对象的对象属性,但会影响实例对象的_proto_属性(_proto_属性内存放的是类的 prototype 域的内容)
Car3.prototype.color = "black";
alert(car3_1.color);//red 该对象有同名的直接属性,故不会去_proto_属性内查找类的 prototype 域的属性
alert(car3_2.color);//black 受影响
 
//直接修改实例对象的方法,解析器会先去找实例对象是否有这个方法(不会去找实例对象的 _proto_ 属性内的那些类的 prototype 域的方法,而是直接查看这个实例是否有对应的方法(与_proto_同级))
//如果没有则直接给这个实例对象添加该方法,但不会修改类的prototype域的同名方法,既实例对象的_proto_属性内的那些类 prototype 域方法不会被修改
//car3_1对象内无名为 showColor 的对象方法属性,故将该方法属性添加到该对象上
car3_1.showColor = function () {
    alert("new function");
}
//解析器对实例对象调用方法属性的时候会先查找该实例有无同名的直接方法属性
//如果没有,则查找_proto_属性内保存的那些 当前类的 prototype 域的方法属性
//有就返回,无则继续查找是否有原型链中的对应的方法属性
//找到就返回,无则报错
 
car3_1.showColor();//new function
car3_2.showColor();//blue
car3_1.abcd();//直接报错
 
//直接修改类的 prototype 域内的方法属性,不会影响该类的实例对象的方法属性,但会影响实例对象的_proto_属性(_proto_属性内存放的是类的 prototype 域的内容)
Car3.prototype.showColor = function () {
    alert("second function");
}
car3_1.showColor();//new function 该对象有同名的方法属性,故不会去_proto_属性内查找类的 prototype 域的方法属性
car3_2.showColor();//second function 受影响

可以看出使用该方法虽然说打打减少了内存的浪费,但依旧有问题,某个对象的属性一旦改变,所有由该类实例化得到的对象的__proto__内属性值也会跟着变(实为引用),改进如下

现在又需要这样的一个实例,你可能会像这样来定义:

复制代码 代码如下:

6.构造器方式与原型方式的混合模式

JavaScript

//每个对象有专属的属性不会与其他对象共享 function Car4(sColor,iDoors){
this._color = sColor;//私有属性变量名称头加下划线标识 this._doors =
iDoors; this.drivers = new Array(“Mike”,”John”);//公有属性标识 }
//所有对象共享一个方法版本,减少内存浪费 Car4.prototype.showColor =
function () { alert(this._color); }; var car4_1 = new Car4(“red”,4);
var car4_2 = new Car4(“blue”,3); car4_1.drivers.push(“Bill”);
alert(car4_1.drivers);//”Mike”,”John”,”Bill”
alert(car4_2.drivers);//”Mike”,”John”

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
//每个对象有专属的属性不会与其他对象共享
function Car4(sColor,iDoors){
    this._color = sColor;//私有属性变量名称头加下划线标识
    this._doors = iDoors;
    this.drivers = new Array("Mike","John");//公有属性标识
}
//所有对象共享一个方法版本,减少内存浪费
Car4.prototype.showColor = function () {
    alert(this._color);
};
 
var car4_1 = new Car4("red",4);
var car4_2 = new Car4("blue",3);
 
car4_1.drivers.push("Bill");
 
alert(car4_1.drivers);//"Mike","John","Bill"
alert(car4_2.drivers);//"Mike","John"

这也是常用的创建对象方式之一

复制代码 代码如下:

function showColor()
{
   alert(this.color);
}
function createCar(sColor,iDoors,iMpg)
{
   var oTempCar=new Object;
   oTempCar.color=sColor;
   oTempCar.doors=iDoors;
   oTempCar.mpg=iMpg;
   oTempCar.showColor=showColor;
   return oTempCar;
}
var oCar1=createCar(“red”,4,23);
var oCar2=createCar(“blue”,3,25);
oCar1.showColor();
oCar2.showColor();

7.动态原型模式

JavaScript

function Car5(sColor,iDoors,iMpg){ this.color = sColor; this.doors =
iDoors; this.mpg = iMpg; this.drivers = new Array(“Mike”,”John”);
//使用标志(_initialized)来判断是否已给原型赋予了任何方法,保证方法永远只被创建并赋值一次
if(typeof Car5._initialized ==
“undefined”){//因为这里的标记是附加在类上,故如果后期直接对其进行修改,还是有可能出现再次创建的情况
Car5.prototype.showColor = function () {//为Car5添加一个存放在 prototype
域的方法 alert(this.color); }; Car5._initialized =
true;//设置一个静态属性 } } var car5_1 = new Car5(“red”,3,25); var
car5_2 = new Car5(“red”,3,25);

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
function Car5(sColor,iDoors,iMpg){
    this.color = sColor;
    this.doors = iDoors;
    this.mpg = iMpg;
    this.drivers = new Array("Mike","John");
 
    //使用标志(_initialized)来判断是否已给原型赋予了任何方法,保证方法永远只被创建并赋值一次
    if(typeof Car5._initialized == "undefined"){//因为这里的标记是附加在类上,故如果后期直接对其进行修改,还是有可能出现再次创建的情况
        Car5.prototype.showColor = function () {//为Car5添加一个存放在 prototype 域的方法
            alert(this.color);
        };
        Car5._initialized = true;//设置一个静态属性
    }
}
var car5_1 = new Car5("red",3,25);
var car5_2 = new Car5("red",3,25);

这种模式使得定义类像强类型语言例如 java 等语言的定义模式

var oCar2 = new Object();
oCar2.color = “blue”;
oCar2.doors = 5;
oCar2.mpg = 25;
oCar2.showColor = function () {
alert(this.color);
};

这样就不需要为每一个对象都创建自己的showColor函数,而只是创建指向这个函数的指针.这从功能上解决了问题,但是该函数却不像对象的方法。于是,引出了构造函数的方式。

8.混合工厂模式

JavaScript

function Car6(){ var oTempCar = new Object; oTempCar.color = “blue”;
oTempCar.doors = 4; oTempCar.showColor = function () {
alert(this.color); }; return oTempCar; } var car6 = new Car6();

1
2
3
4
5
6
7
8
9
10
function Car6(){
    var oTempCar = new Object;
    oTempCar.color = "blue";
    oTempCar.doors = 4;
    oTempCar.showColor = function () {
        alert(this.color);
    };
    return oTempCar;
}
var car6 = new Car6();

由于在 Car6()构造函数内部调用了 new 运算符,所以将忽略第二个 new
运算符(位于构造函数之外),
在构造函数内部创建的对象被传递回变量car6,这种方式在对象方法的内部管理方面与经典方式(工厂方法)有着相同的问题.应尽量避免

1 赞 3 收藏
评论

图片 2

这样遇到的问题是每个对象都需要重新定义一次他的字段和方法。很麻烦。

2.构造函数方式 构造函数与工厂函数很相似,示例代码如下:

二、类的定义–工厂方式实现:

复制代码 代码如下:

对上面的例子进行一个包装,利用函数的返回值来做文章:

function Car(sColor,iDoors,iMpg)
{
   this.color=sColor;
   this.doors=iDoors;
   this.mpg=iMpg;
   this.showColor=function()
   {
      alert(this.color);
   }
}
var oCar1=new Car(“red”,4,23);
var oCar2=new Car(“blue”,3,25);

复制代码 代码如下:

在构造函数中,内部无创建对象,而是使用this关键字。使用new运算符调用构造函数时,在执行第一行代码之前先创建一个对象,只有用this才能访问这个对象。但是这会遇到什么问题呢,很显然,它的每个对象也都会创建自己的showColor函数版本。为解决这个问题,引出了以下的原型方式.

function createCar() {
var oTempCar = new Object();
oTempCar.color = “red”;
oTempCar.doors = 4;
oTempCar.mpg = 23;
oTempCar.showColor = function () {
alert(this.color);
};
return oTempCar;
}

3.原型方式 该方式利用了对象的prototype属性,可把它看成创建新对象所依赖的原型。这里,用空构造函数来设置类名。然后把所有的方法和属性都直接赋予prototype属性。如下:

调用方式:

复制代码 代码如下:

var oCar1 = createCar();
var oCar2 = createCar();

function Car()
{}
Car.prototype.color=”red”;
Car.prototype.doors=4;
Car.prototype.mpg=23;
Car.prototype.drivers=new Array(“Mike”,”Sue”);
Car.prototype.showColor=function()
{
   alert(this.color);
}

这种方式被称之为工厂方式。工厂方式看起来是省事多了。起码创建一个对象的时候不再需要那么多的行数。因为每个属性(color,doors,mpg)的值都是固定的,还需要再次进行改造,利用参数传递来实现:

原型方式只能直接赋值,而不能通过给构造函数传递参数初始化属性的值。在用这种方式时,会遇到两个问题,不知道大家注意到没有。第一问题是采用这种方式必须创建每个对象后才能改变属性的默认值。而不能在创建每个对象时都会直接有自己所需要的属性值。这点很讨厌。第二个问题在于属性所指的是对象的时候。函数共享不会出现任何问题,但是对象共享却会出现问题。因为每个实例一般都要实现自己的对象。

复制代码 代码如下:

如下面:

function createCar(sColor, iDoors, iMpg) {
var oTempCar = new Object();
oTempCar.color = sColor;
oTempCar.doors = iDoors;
oTempCar.mpg = iMpg;
oTempCar.showColor = function () {
alert(this.color);
};

复制代码 代码如下:

return oTempCar;
}

var oCar1=new Car();
var oCar2=new Car();
oCar1.drivers.push(“Matt”);
alert(oCar1.drivers);//输出 “Mike,Sue,Matt”
alert(oCar2.drivers);//输出”Mike,Sue,Matt”

var oCar1 = createCar(“red”, 4, 23);
var oCar2 = createCar(“red”, 4, 23);

因此drivers属性只是指向对象的指针,所以所有的实例事实上共享同一个对象。由于出现这这些问题,我们引出了下面的联合使用构造函数和原型方式。

oCar1.showColor();
oCar2.showColor();

4.混合的构造函数/原型方式 这种方式的思想是用构造函数定义对象的所有非函数属性(包括普通属性和指向对象的属性),用原型方式定义对象的函数属性(方法)。结果使得所有的函数都只被创建一次,而每个对象都有自己的对象属性实例。示例代码如下:

这样做看似的确可以实现了对象了。实现也很简单,调用也很方便。但是有两个不是很好的地方:

复制代码 代码如下:

相关文章

No Comments, Be The First!
近期评论
    功能
    网站地图xml地图