php面向对象__toString() 用法详解

 更新时间:2016年11月25日 15:01  点击:1904
本文章来给各位同学介绍一下关于php面向对象__toString() 用法详解,, __toString() 方法是自动被调用的,是在直接输出对象引用时自动调用的


我们前面说过在类里面声明“--”开始的方法名的方法(PHP给我们提供的),都是在某一时刻不同情况下自动调用执行的方法,“__toString()”方法也是一样自动被调用的,是在直接输出对象引用时自动调用的, 前面我们讲过对象引用是一个指针,比如说:“$p=new Person()“中,$p就是一个引用,我们不能使用echo 直接输出$p, 这样会输出”Catchable fatal error: Object of class Person could not be converted to string“这样的错误,如果你在类里面定义了“__toString()”方法,在直接输出对象引用的时候,就不会产生错误,而是自动调用了”__toString()”方法, 输出“__toString()”方法中返回的字符,所以“__toString()”方法一定要有个返回值(return 语句).

代码

 代码如下 复制代码

<?php
    // Declare a simple class
    class TestClass
    {
        public $foo;

        public function __construct($foo) {
        $this->foo = $foo;
        }
       //定义一个__toString方法,返加一个成员属性$foo
        public function __toString() {
        return $this->foo;
        }
    }

    $class = new TestClass('Hello');

    //直接输出对象
    echo $class;
?>

似曾相识,在php面向对象编程之魔术方法__set,曾经介绍了什么是魔术方法,这一章又介绍一个魔术方法__tostring()。


__toString()是快速获取对象的字符串信息的便捷方式,似乎魔术方法都有一个“自动“的特性,如自动获取,自动打印等,__toString()也不例外,它是在直接输出对象引用时自动调用的方法。


__toString()的作用

当我们调试程序时,需要知道是否得出正确的数据。比如打印一个对象时,看看这个对象都有哪些属性,其值是什么,如果类定义了toString方法,就能在测试时,echo打印对象体,对象就会自动调用它所属类定义的toString方法,格式化输出这个对象所包含的数据。

下面我们来看一个__toString()的实例

 

 代码如下 复制代码

<?php 

02 class Person{ 

03     private $name = ""; 

04     function __construct($name = ""){ 

05                    

06         $this->name = $name; 

07     } 

08     function say(){ 

09                    

10         echo "Hello,".$this->name."!<br/>";   

11     } 

12     function __tostring(){//在类中定义一个__toString方法 

13         return  "Hello,".$this->name."!<br/>";     

14     } 

15 } 

16 $WBlog = new Person('WBlog'); 

17 echo $WBlog;//直接输出对象引用则自动调用了对象中的__toString()方法 

18 $WBlog->say();//试比较一下和上面的自动调用有什么不同 

19 ?>


程序输出:

Hello,WBlog!

Hello,WBlog!


如果不定义“__tostring()”方法会怎么样呢?例如在上面代码的基础上,把“ __tostring()”方法屏蔽掉,再看一下程序输出结果:


Catchable fatal error: Object of class Person could not be converted to string


由此可知如果在类中没有定义“__tostring()”方法,则直接输出以象的引用时就会产生误法错误,另外__tostring()方法体中需要有一个返回值。

本文章来给各位同学介绍在php类中我们会常用到this 关键字了,下面我简单的分析一下在php面向对象 $this关键字用法希望此教程对各位同学会有所帮助呀。

在前面我们知道,在对象外部访问对象成员属性和方法,使用对象的引用来完成。而在对象内部中,成员方法访问自己对象中的其它成员属性或者成员方法,要使用特殊的对象引用"$this->值"的形式来访问,成员属于哪个对象,$this引用就代表哪个对象,并且只能在对象的成员方法中使用。

为了解决php类和对象中变量与属性的命名冲突和不确定性问题,引入了”$this”关键字来调用当前的对象。

在类中调用当前对象的属性和方法,必须使用”$this->”关键字;$this在构造函数中指该构造函数所创建的新对象;方法内的局部变量不属于对象,不使用$this关键字取值。使用$this关键字,我们可以在类中调用对象属性或者方法。

1、调用变量

实例:

 代码如下 复制代码
<?php
 class user{
  private $n;
  function __construct(){
   $name="Mike";
   echo $this->n=$name;
  }
 }
 $p=new user();
?>

2、调用方法

实例:

 代码如下 复制代码

<?php
 class cal{
  public function sum($a,$b){
   return $a+$b;
  }
  public function prt($a,$c){
   return $a*$c;
  }
  public function result($a,$b,$c){
   $a=$this->sum($a,$b);
   return $this->prt($a,$c);
  }
 }
 $c=new cal();
 echo "(2+3)*10= " .$c->result('2','3','10');
?>


我们来看一下下面的例子,$this在做了什么?

 代码如下 复制代码
class Person{
//下面是人的成员属性
var $name; //人的名子
var $sex; //人的性别
var $age; //人的年龄
//定义一个构造方法参数为属性姓名$name、性别$sex和年龄$age进行赋值
function __construct($name="", $sex="", $age=""){
$this->name=$name;
$this->sex=$sex;
$this->age=$age;
}
//这个人可以说话的方法, 说出自己的属性
function say() {
echo "我的名子叫:".$this->name." 性别:".$this->sex." 我的年龄是:".$this->age."<br>";
}
//对象克隆时自动调用的方法, 如果想在克隆后改变原对象的内容,需要在__clone()中重写原本
的属性和方法
function __clone(){
//$this指的复本p2, 而$that是指向原本p1,这样就在本方法里,改变了复本的属性。
$this->name="我是假的$that->name";
$this->age=30;
}
}
$p1=new Person("张三", "男", 20);
$p2=clone $p1;
$p1->say();
$p2->say();
?>

上例输出:

执行结果
我的名子叫:张三性别:男我的年龄是:20
我的名子叫:我是假的张三性别:男我的年龄是:30

我们来看一下上面的代码中$this做了什么:

1、访问对象内部的成员,如$this->name

2、访问对象的其它方法,如在say()方法内部访问了其之外的$this->run()和$this->eat("apple")方法。

另外还有一点值得注意的是,局部变量和成员属性可以同名,但作用范围和访问方式不一样,如在eat()方法体内的$name相当于局部变量,其作用范围只限于eat方法内部,而Person的成员属性声明部分的 $name,则相当于全局变量,可以其它方法中使用$this->name的形式访问。

 代码如下 复制代码

< ?php  
class UserName 
{  
//定义属性  
private $name; 
//定义构造函数 
function __construct( $name ) 

$this->name = $name;
//这里已经使用了this指针 

//析构函数 
function __destruct(){}  
//打印用户名成员函数 
function printName() 

print( $this->name );
//又使用了PHP关键字this指针 

}  
//实例化对象 
$nameObject = new UserName
( "heiyeluren" );  
//执行打印 
$nameObject->printName();
 //输出: heiyeluren 
//第二次实例化对象 
$nameObject2 = new UserName( "PHP5" ); 
//执行打印 
$nameObject2->printName(); //输出:PHP5 
?>

本文章来给大家介绍一下关于在php面向对象__call处理错误调用技巧吧,call在以前很少用,今天就来给大家测试一下。


在提到__call之前,先来看一个实例的测试结果,以便更好地去了解__call方法的作用。上代码:

在调用对象中不存在的方法时就会出现系统报错,然后程序退出不能继续执行。如果在类中添加一个“魔术”方法__call(),则调用对象中不存在的方法时就会自动调用该方法,并且程序可以继续向下执行。可以通过在__call()方法中的设置,提示用户调用的方法及需要的参数列表内容不存在。__call()方法需要两个参数,第一个参数是调用不存在的方法时,接受这个不存在的方法的方法名,并将这个不存在的方法中,使用的参数列表形成数组传给__call()方法中的第二个参数。

代码

 代码如下 复制代码

 <?php

    //这是一个测试的类,里面没有属性和方法
    class Test
    {
    }


    //产生一个Test类的对象

    $test=new Test();


    //调用对象里不存在的方法

    $test->demo("one", "two", "three");


    //程序不会执行到这里

    echo "this is a test<br>";


?>

运行结果:Fatal error: Call to undefined method Test::demo()

我们知道,程序的运行结果抛出了错误提示,在运行的过程中抛出错误后就已经中断了,以致”$Person->say();“这个正确的方法也不能再继续运行。看一下上面的代码就知道,Person类并没有代码错误,错就错在实例化Person类的过程中调用了Person类中并不存在的方法,如run()和eat()。

  在程序的运行中,出现如上抛出的的错误是致命性的,整个程序将崩溃。为了处理这种错误的同时让程序继续执行,我们可以在类中添加一个魔术方法__call,来调用对象中不存在的方法时自动调用该方法,并且使程序可以继续向下执行。

下面将在上面的代码的基础上多添加一个__call方法并调试,代码如下:
代码

 代码如下 复制代码

 <?php

    //这是一个测试的类,里面没有属性和方法
    class Test
    {

        //调用不存的方法时自动调用的方法,第一个参数为方法名,第二个参数是数组参数

        function __call($function_name, $args)
        { 

            print "你所调用的函数:$function_name(参数:"; 

            print_r($args); 

            echo "不存在!<br>n";

        }

    }


    //产生一个Test类的对象

    $test=new Test();


    //调用对象里不存在的方法

    $test->demo("one", "two", "three");


    //程序不会退出可以执行到这里

    echo "this is a test<br>";

?>

运行结果:

你所调用的函数:run(参数:Array ( [0] => teacher ) )不存在!

你所调用的函数:eat(参数:Array ( [0] => child [1] => apple ) )不存在!

Hello, wblog!

这次程序的运行结果不再抛出致命性错误,在调用不存在的方法时自动调用了__call方法捕捉处理不存在的方法并提示给用户,而调用存在的方法时程序正常执行。


总结:在类中添加一个魔术方法__call,在调用对象中不存在的方法时就会自动调用该方法,并且程序可以继续向下执行。

本文章来给大家简单的介绍一下关于php自动加载类__autoload()的方法,希望此方法对各位同学会有所帮助哦。

作用:当在程序中需要实例化一个类,刚好这这类又不是在本文件中,则需要用包含函数将外部文件包含进来。但是,当要用的外部类很多后,就会发现用包含函数会显得十分的繁琐,这是就可以用__autoload()全局函数自动加载类。

当在index.php中要使用前面三个类时,就需要写三个例如include("name.class.php") 这样的方法,效率会十分低,但如果使用了__autoload()函数就不用这样麻烦了,只需要写这样一个函数方法就可以了:

在 PHP 5 中,不再需要这样了。可以定义一个 __autoload() 函数,它会在试图使用尚未被定义的类时自动调用。通过调用此函数,脚本引擎在 PHP 出错失败前有了最后一个机会加载所需的类。

在下例中将通过实例来说明 __autoload() 是如何使用的。


首先定义一个类ClassA,文件名为ClassA.class.php

 代码如下 复制代码

 class ClassA{ 

 public  function funa(){ 

   echo "classA  loaded successfully!<br>"; 

  } 

}

然后在相同目录下再定义另一个类ClassB,文件名为ClassB.class.php,ClassB继承ClassA

 <?php 

 代码如下 复制代码

 class ClassB extends ClassA { 

 public function funb(){ 

                                                       

   echo "classB also loaded successfully!<br>"; 

  } 

 }

最后在与上面两个文件相同目录下再定义一个autoload.php(这个文件名随便取)

 代码如下 复制代码

 <?php 

function __autoload($class_name) { 

    require_once ("./".ucfirst($class_name).'.class.php');//ucfirst使类名首字母转换为大写 

 $obj = new ClassB(); 

$obj->funa(); 

$obj->funb(); 

?>

运行autoload.php的程序,看结果:

classA loaded successfully!

classB also loaded successfully!


例子: 文件夹下有这样几个文件:

User.class.php;
Person.class.php;
Message.class.php;
index.php;


我们就可以这样操作

 代码如下 复制代码

index.php

function __autoload($className){     //ucfirst() 将字符串首字母变为大写

include("ucfirst($className)".class.".php"); }

/**************

*例如:在index.php文件中实例化User.class.php中的User类,如果不存在则自动调用__autoload()函数

 代码如下 复制代码

*,将类名User作为参数传入

*************/

$user=new User();

//通过自动加载类调用User.class.php文件

$person=new Person();

//通过自动加载类调用Person.class.php文件

$Message=new Message();

//通过自动加载类调用Message.classphp文件 function="" message="new" person="new" user="new">

本文章来给大家整理一下关于php面向对象中子类中重载父类详解,希望此文章对各位理解php子类中重载父类有所帮助哦。


因为在PHP中不能存在同名的函数,所以在同一个类中也就不能定义重名的方法。这里所说的重载是指在    子类中可以定义和父类同名的方法从而覆盖从父类中继承过来的方法。


子类中重载父类的方法

 代码如下 复制代码


<?php
      class Person{
                                                              
           public $name;     
                                                             
           public function __construct($name="" ){
                $this->name =$name;
                                                                      
           }
           public  function say(){
                echo "我叫".$this->name  ;
           }
                                                                 
 }
 ?>
 <?php
      class Student extends Person{
                                                              
           public $name;             
                                                             
           public function __construct($name=""){
                $this->name =$name;
                                                         
           }
 //这里定义了一个和父类中同名的方法,将父类中的说话方法覆盖并重写
           public  function say(){
                echo "我叫".$this->name .",今年25岁了" ;
           }
                                                                 
 }
 ?>

重写方法与访问权限

子类中的覆盖方法不能使用比父类中被覆盖方法更严格的访问权限。

如果父类中的方法的访问权限是protected,那么子类中重写的方法的权限就要是protected或者public;    如果父类中的方法是public,那么子类要重写的方法的权限就只能是public。也许这也就是为什么子类可    以继承父类的私有成员,但却不能使用的原因吧。


重写时的参数数量

子类可以拥有与父类不同的参数数量,如下面的构造方法中,多添加了一个参数$age。

 代码如下 复制代码

 <?php 

      class Student extends Person{ 

                                                

           public $name;     
          public $age;         
                                                

           public function __construct($name="",$age=25){ 
                $this->name =$name; 

                $this->age =$age; 

          } 

          public  function say(){ 

                echo "我叫".$this->name .",今年".$this->age."岁了" ;   

           }  
                                                   

 } 
 ?>

构造函数重写

上面提到的“重写时的参数数量”就已经实现了子类对父类的构造函数进行了重写,但这不是一种好的写    法,如果仔细观察,你会发现,上面子类Student对父类Person构造函数的重写,其实就是在父类的构造    函数的基础上多添加了一个参数,但是又把父类原有的参数照写一遍,因为父类Person的构造函数只有一    个参数,所以我们照写一遍不觉得有什么麻烦,但是如果参数不止一个,而是几个或者更多,那么你就会    发现它的繁琐之处,那么有没有办法可以简化这个问题呢?答案是肯定的,可通过使用"parent::方法名"    在子类的重载方法中调用父类中被它覆盖的方法。如使用"parent::__construct()"调用父类中被覆盖的    构造方法,其它方法的类似,于是上面的代码可以简化为:

 代码如下 复制代码

 <?php 

      class Student extends Person{ 

                                      

           public $name;     

           public $age;         
                                     
          public function __construct($name="",$age=25){ 

              parent::__construct($name,$age); 

              $this->age =$age; 
         } 

           public  function say(){ 
             parent::say(); 

              echo ",今年".$this->age."岁了" ;   

          }  
                                         
 } 
 ?>

下再看一个实例

PHP5重写方法
先设置一个父类,这个父类是 “Dog”类,这个类描述了dog的特性。

Dog有2个眼睛,会跑,会叫。就这样描述先。

我养了一直狗,是只小狗,符合Dog类的特性,但有所不同。

我的小狗有名字,我的小狗太小了,不会大声的叫,只会哼哼。

我们用继承的概念去实现这个设计。

 代码如下 复制代码

<?
// 狗有两只眼睛,会汪汪叫,会跑.
class  Dog {
 protected  $eyeNumber =2; //属性
 //返回封装属性的方法.
 public function getEyeNumber(){
  return $this->eyeNumber;
 }
 //狗会叫 
 public function  yaff(){
  return  "Dog yaff, wang ..wang ..";
 }
 //狗会跑
 public function  run(){
  return  "Dog run..running ...";
 }
}
$dog = new Dog();
echo "dog have ".$dog->getEyeNumber()." eyes. <br>";
echo $dog->yaff() ."<br>".$dog->run();
echo  "<br><br>";
//这是我的小狗叫"狗狗",它很小.不会汪汪叫,只会哼哼哼..
class MyDog extends Dog {
 private $name = "狗狗";
 public function getName(){
  return $this->name;
 }
    public function  yaff(){
  return  $this->name." yaff, heng...heng ..";
 } 
}
$myDog = new MyDog();
echo $myDog->getName()." have ".$myDog->getEyeNumber()." eyes. <br>";
echo $myDog->yaff() ."<br>".$myDog->run();
?>

程序运行结果:

dog have 2 eyes.
Dog yaff, wang ..wang ..
Dog run..running ...

狗狗 have 2 eyes.
狗狗 yaff, heng...heng ..
Dog run..running ...

重写方法与访问权限
子类中的覆盖方法不能使用比父类中被覆盖方法更严格的访问权限。

父类为public 子类为 private时。

 代码如下 复制代码

<?
// 简化dog类和mydog类,演示重写的访问权限.
class Dog {
 protected  $eyeNumber =2; //属性
 //返回封装属性的方法.
 public function getEyeNumber(){
  return $this->eyeNumber;
 } 
}

class MyDog extends Dog {
 protected function getEyeNumber(){
  return $this->eyeNumber;
 } 
}
/*
class MyDog extends Dog {
 private function getEyeNumber(){
  return $this->eyeNumber;
 } 
}
*/

?>

程序运行结果:
 Fatal error: Access level to MyDog::getEyeNumber() must be public (as in class Dog) in E:PHPProjectstest.php on line 15

父类为public 子类为 protected时。

 

 代码如下 复制代码

<?
// 简化dog类和mydog类,演示重写的访问权限.
class Dog {
 protected  $eyeNumber =2; //属性
 //返回封装属性的方法.
 public function getEyeNumber(){
  return $this->eyeNumber;
 } 
}

class MyDog extends Dog {
 private function getEyeNumber(){
  return $this->eyeNumber;
 } 
}

?>

程序运行结果:

 Fatal error: Access level to MyDog::getEyeNumber() must be public (as in class Dog) in E:PHPProjectstest.php on line 15

重写时的参数数量
子类可以拥有与父类不同的参数数量。(这点与java不同,PHP是弱类型语言。)

 代码如下 复制代码


<?
// 简化dog类和mydog类,演示重写方法的参数.
class  Dog {
 protected  $eyeNumber =2; //属性
 //返回封装属性的方法.
 public function getEyeNumber(){
  return $this->eyeNumber;
 } 
}
class MyDog extends Dog {
 //重写的方法与父类的方法有不同的参数数量.
 public function getEyeNumber($eys){
  $this->eyeNumber = $eys;
  return $this->eyeNumber;
 } 
}

$myDog = new MyDog();
echo "my dog hava ".$myDog->getEyeNumber(3) ." eyes.";
//啸天犬..哈..
//下面这句会报一个丢失参数的错误.
//echo "my dog hava ".$myDog->getEyeNumber() ." eyes.";
?>

程序运行结果:

 my dog hava 3 eyes.

构造函数重写

下面这个例子中,父类和子类都有自己的构造函数,当子类被实例化时,子类的构造函数被调用,而父类的构造函数没有被调用,请对比第一节的构造函数继承。

 

 代码如下 复制代码

<?
//2-2 / extends1.php
//构造函数继承的问题.
class Animal{
 public $legNum = 0;
 public function __construct(){
  $this->legNum = 4;
  echo "I am an animal<br>";
 }
}
class Dog1 extends Animal {
 public function __construct(){
  $this->legNum = 4;
  echo "I am a Dog .<br>";
 }
}
$dog1 = new Dog1();
echo "<br>";
echo  "legNum is ".$dog1->legNum;
/*
实例化子类时.构造函数被调用了.
*/
?>

程序运行结果:

 I am a Dog . 
legNum is 4

注:这点和Java不同,在java中构造函数是不能被继承的,而且子类实例化时,子类的构造函数被调用,父类的构造函数也会调用。

[!--infotagslink--]

相关文章

  • java8如何用Stream查List对象某属性是否有重复

    这篇文章主要介绍了java8如何用Stream查List对象某属性是否有重复的操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...2021-09-11
  • C#中using的三种用法

    using 指令有两个用途: 允许在命名空间中使用类型,以便您不必限定在该命名空间中使用的类型。 为命名空间创建别名。 using 关键字还用来创建 using 语句 定义一个范围,将在此...2020-06-25
  • R语言 如何删除指定变量或对象

    这篇文章主要介绍了R语言删除指定变量或对象的操作方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-05-06
  • JavaScript预解析,对象详解

    这篇文章主要介绍了JavaScript预解析,对象的的相关资料,小编觉得这篇文章写的还不错,需要的朋友可以参考下,希望能够给你带来帮助...2021-11-10
  • 如何在Spring WebFlux的任何地方获取Request对象

    这篇文章主要介绍了如何在Spring WebFlux的任何地方获取Request对象,帮助大家更好的理解和使用springboot框架,感兴趣的朋友可以了解下...2021-01-26
  • 牛叉的Jquery――Jquery与DOM对象的互相转换及DOM的三种操作

    只有jQuery对象才能调用jQuery类库的各种函数,同样有些dom对象的属性和方法在jQuery上也是无法调用的,不过基本上jQuery类库提供的函数包含了所有的dom操作。这就需要我们知道如何将jQuery对象和DOM的相互转换的方法。1...2015-10-30
  • js如何打印object对象

    js调试中经常会碰到输出的内容是对象而无法打印的时候,光靠alert只能打印出object标示,却不能打印出来里面的内容,甚是不方便,于是各方面整理总结了如下一个函数,能够将数组或者对象这类的结果一一打印出来,具体代码如下: fu...2015-10-21
  • iscroll.js 用法介绍

    最新版下载: http://www.csdn123.com/uploadfile/2015/0428/20150428062734485.zip 概要 iScroll 4 这个版本完全重写了iScroll这个框架的原始代码。这个项目的产生...2016-05-19
  • javascript self对象使用详解

    这篇文章主要介绍了javascript self对象使用详解的相关资料,需要的朋友可以参考下...2016-10-20
  • 替换json对象中的key最佳方案

    本文给大家介绍如何替换json对象中的key,通过实例代码给大家介绍key的替换方法,代码也很简单,需要的朋友参考下吧...2021-06-02
  • 详解Javascript中的Object对象

    这篇文章主要介绍了详解Javascript中的Object对象,需要的朋友可以参考下...2016-03-01
  • C#中的try catch finally用法分析

    这篇文章主要介绍了C#中的try catch finally用法,以实例形式分析了try catch finally针对错误处理时的不同用法,具有一定的参考借鉴价值,需要的朋友可以参考下...2020-06-25
  • C++中cin的用法详细

    这篇文章主要介绍了C++中cin的用法详细,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-04-25
  • Bootstrap媒体对象的实现

    在web页面中,图片居左,内容居右排列,是非常常见的效果,它也就是媒体对象,它是一种抽象的样式,可以用来构建不同类型的组件。本文给大家介绍Bootstrap媒体对象的实现,感兴趣的朋友一起学习吧...2016-05-04
  • ActiveX部件不能创建对象:dm.dmsoft代码:800A01AD

    vbs调用插件报:ActiveX部件不能创建对象,代码:800A01AD,一般是因为病毒导致dll文件丢失或者64系统问题导致,需要的朋友可以参考下...2020-06-30
  • 理解JavaScript事件对象

    这篇文章主要为大家介绍了JavaScript事件对象,了解JavaScript事件...2016-01-26
  • 示例详解react中useState的用法

    useState 通过在函数组件里调用它来给组件添加一些内部 state,React 会在重复渲染时保留这个 state,接下来通过一个示例来看看怎么使用 useState吧...2021-06-04
  • 对象题目的一个坑 理解Javascript对象

    这篇文章主要介绍了Javascript对象,特别为大家分享了对象题目的一个坑,提供了解题思路,感兴趣的小伙伴们可以参考一下...2015-12-24
  • Xml中使用foreach遍历对象实现代码

    这篇文章主要介绍了Xml中使用foreach遍历对象实现代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...2020-12-04
  • javascript创建对象的几种模式介绍

    下面小编就为大家带来一篇javascript创建对象的几种模式介绍。小编觉得挺不错的,现在分享给大家,也给大家做个参考...2016-05-09