转载:http://blog.sina.com.cn/s/blog_60f632050100wz7h.html

(1)基于已有对象的扩充方法:适用于临时构建对象,弊端:每次构建对象都要新建一个。

  1. var object=new Object();
  2. object.name="Tom";
  3. object.sayname=function(name)
  4. {
  5. this.name=name;
  6. alert(this.name);
  7. }
  8. object.sayname("James");

(2)工厂方法 :可以重复返回多个对象。

  1. function createObject(){
  2. var object=new Object();
  3. object.username="Tom";
  4. object.password="123";
  5. object.get=function(){
  6. alert(this.username+","+this.password);
  7. }
  8. return object;
  9. }
  10. var o1=createObject();
  11. var o2=createObject();
  12. o2.username="james";
  13. o1.get();
  14. o2.get();

工厂方法的改进:

因为js的函数定义是指向一个应用的对象,所以每次构建一个object对象,都会构建一个get方法的对象,现在将get方法分离,那么就是多个object对象共用一个get对象,这样就可以节省内存空间。改进如下:

  1. function get(){
  2. alert(this.username+","+this.password);
  3. }
  4. function createObject(username,password){
  5. var object=new Object();
  6. object.username=username;
  7. object.password=password;
  8. object.get=get;
  9. return object;
  10. }
  11. var o1=createObject();
  12. var o2=createObject();
  13. o1.get();
  14. o2.get();

(3)构造方法创建对象:

  1. <span style="white-space:pre">    </span>function getInfo(){
  2. <span style="white-space:pre">        </span>alert(this.username+","+this.password);
  3. <span style="white-space:pre">    </span>}
  4. function Person(username,password){
  5. //在执行第一行代码前,js引擎会生产一个对象。即浏览器
  6. this.username=username;
  7. this.password=password;
  8. this.getInfo=getInfo;
  9. //此处隐含了一个return object的语句。
  10. }
  11. //只有在使用new Person();才会有上述Person中注释出现的情况,如果不适用new语句是不会          //成功的。
  12. var person=new Person("Tom","abc");
  13. person.getInfo();
  14. var person2=new Person("Jame","123");
  15. person2.getInfo();

(4)原型方法:(prototype)
因为js的所有类都是继承Object,Object中有prototype属性,因此自定义的对象也有prototype属性:如下

  1. function Person(){}
  2. Person.prototype.username="Tom";
  3. Person.prototype.password="1325";
  4. Person.prototype.getInfor=function(){
  5. alert(this.username+" , "+this.password);
  6. }
  7. var person=new Person();
  8. var person2=new Person();
  9. person.username="James";
  10. person.getInfor();
  11. person2.getInfor();

这种方法的缺点就是不能传递参数,只能在创建后修改属性。另外使用这种方法定义的对象都贡献同样的属性,因为他们都共用了object对象中的prototype对象,所以所有的对象贡献原型中的属性,其中一个更改了属性,也会反映到其他对象中去。

为了解决原型方法中对象贡献属性,可以采用构造方法+原型的方法去构建对象。把属性用构造方法定好。具体方法就用原型设置。
如下:

  1. <script type="text/javascript">
  2. function  Person(password){
  3. this.username=new Array();
  4. this.password=password;
  5. }
  6. Person.prototype.getInfo=function(){
  7. alert(this.username+","+this.password);
  8. }
  9. var p1=new Person("abc");
  10. p1.username.push("Tom");
  11. p1.getInfo();
  12. </script>

(5)动态原型的方法:

    1. function Person(username,password){
    2. this.username=username;
    3. this.password=password;
    4. if( typeof Person.first=="undefined" ){//通过设置标志量让getInfo只生成一次对象。
    5. alert("invoke");
    6. Person.prototype.getInfo=function(){
    7. alert(this.username+" , " +this.password);
    8. }
    9. Person.first=true;
    10. }
    11. }
    12. var p1=new Person("Tom","123");
    13. var p2=new Person("James","abc");
    14. p1.getInfo();
    15. p2.getInfo();

js中定义对象的几种方式的更多相关文章

  1. JavaScript学习12 JS中定义对象的几种方式

    JavaScript学习12 JS中定义对象的几种方式 JavaScript中没有类的概念,只有对象. 在JavaScript中定义对象可以采用以下几种方式: 1.基于已有对象扩充其属性和方法 2.工 ...

  2. JavaScript学习12 JS中定义对象的几种方式【转】

    avaScript学习12 JS中定义对象的几种方式 转自:  http://www.cnblogs.com/mengdd/p/3697255.html JavaScript中没有类的概念,只有对象. ...

  3. (六)javascriptJS中定义对象的几种方式(转)

    JavaScript学习12 JS中定义对象的几种方式 转自:  http://www.cnblogs.com/mengdd/p/3697255.html JavaScript中没有类的概念,只有对象 ...

  4. JS中访问对象的两种方式区别

    可以使用下面两种方式访问对象的属性和方法 1.对象名.属性名 对象名.方法名() 2.对象名["属性名"] 对象名["方法名"]() var obj = { n ...

  5. JavaScript中定义对象的四种方式

    最近在阅读< JavaScript 高级程序设计>,未免遗忘读过的内容,就打算以博客的形式做些读书笔记.今天介绍的是 JavaScript 中的四种定义对象的方法,除了这四种方法,还有工厂 ...

  6. js中定义变量的三种方式const,val,let 的区别

    js中三种定义变量的方式const, var, let的区别. 1.const定义的变量不可以修改,而且必须初始化. 1 const b = 2;//正确 2 // const b;//错误,必须初始 ...

  7. JS中定义对象和集合

    在js中定义对象: 方式一: var obj = {}; obj['a']=1; obj['b']=2; 方式二: var obj=new Object(); obj.a=1; obj.b=2; 在j ...

  8. js中声明Number的五种方式

    转载自:http://www.jb51.net/article/34191.htm <!DOCTYPE html> <html> <head> <meta c ...

  9. JS中事件绑定的三种方式

    以下是搜集的在JS中事件绑定的三种方式.   1. HTML onclick attribute     <button type="button" id="upl ...

随机推荐

  1. 详解:Python2中的urllib、urllib2与Python3中的urllib以及第三方模块requests

    在python2中,urllib和urllib2都是接受URL请求的相关模块,但是提供了不同的功能.两个最显著的不同如下: 1.urllib2可以接受一个Request类的实例来设置URL请求的hea ...

  2. jquery dataTimePicker日历插件(精确到小时)

    效果图:      下载地址:https://github.com/WangChangyao/jquery-dataTimePicker.git <!DOCTYPE html> <h ...

  3. Proxy 那点事儿

    ---恢复内容开始--- 尊重原创:https://my.oschina.net/huangyong/blog/159788 Proxy,也就是"代理"了.意思就是,你不用去做,别 ...

  4. C++输出二进制文件和文本文件

    所谓二进制文件和文本文件对于字母而言没有什么不同,都是存储该字母的ASCII码值.能引起不同的是数字和一些排版用符号的格式. 数字在二进制文件中会存储该数字的值,而文本文件中则首先将该数字视为字符量, ...

  5. HDU 5912 Fraction(模拟——分子式化简求解)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5912 Problem Description Mr. Frog recently studied h ...

  6. dede从www跟目录迁移,网站空间

    图集缩略图表名dede_uploads                    字段url; 图集文章内部的图片表名dede_addonimages        字段imgurls 频道文章列表的图片 ...

  7. 基于Vue的页面切换左右滑动效果

    HTML文本页面: <template> <div id="app> <transition :name="direction" mode= ...

  8. Java进阶篇(三)——Java集合类

    集合可以看作一个容器,集合中的对象可以很容易存放到集合中,也很容易将其从集合中取出来,还可以按一定的顺序摆放.Java中提供了不同的集合类,这些类具有不同的存储对象的方式,并提供了相应的方法方便用户对 ...

  9. C#如何释放已经加载的图片

    使用Image.FromFile取磁盘上的图片时,这个方法会锁定图片文件,而且会导致内存占用增大, 有几种方法解决:一:将Image类转换成Bitmap类System.Drawing.Image im ...

  10. apache访问日志分析[转]

    当前WEB服务器中联接次数最多的ip地址 #netstat -ntu |awk '{print $5}' |sort | uniq -c| sort -nr 查看日志中访问次数最多的前10个IP #c ...