转载: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. CodeForces731-C.Socks-并查集

    C. Socks time limit per test 2 seconds memory limit per test 256 megabytes input standard input outp ...

  2. DFS入门__poj1979

    Red and Black Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 26944   Accepted: 14637 D ...

  3. Centos7环境搭建lnmp环境

    [原创]编译安装lnmp环境 准备软件:nginx1.10.3+php-5.5.12+mariadb10.0.8(数据库在此使用的yum安装) 如果需要编译安装的可以给我留言,我后续再发布出来! 依赖 ...

  4. 基于ARM的车牌识别技术研究与实现

    在云盘里包含了我本科毕业设计的全部资料和代码.主要涉及下面摘要中的几个部分.虽然系统无法实用,但是适合机器视觉和嵌入式方向的入门.希望能对有志从事相关方向的朋友有所帮助.本人现在在深圳从事机器视觉算法 ...

  5. grunt 插件开发注意事项

    grunt的插件机制 task.loadNpmTasks = function(name) { var root = path.resolve('node_modules'); var tasksdi ...

  6. React Native学习(七)—— FlatList实现横向滑动列表效果

    本文基于React Native 0.52 Demo上传到Git了,有需要可以看看,写了新内容会上传的.Git地址 https://github.com/gingerJY/React-Native-D ...

  7. 【ELK_Log4net】.net Core重写一个TcpAppender

    最近再搞ELK,三个工具部署完毕,想再继承上log4net.没想到.net core版Log4net竟然没有直接Tcp发送消息的appender.醉了.log4net 1.RemotingAppend ...

  8. 如何节省 1TB 图片带宽?解密极致图像压缩

    欢迎大家前往云+社区,获取更多腾讯海量技术实践干货哦~ 作者:Gophery 本文由 腾讯技术工程官方号 发布在云+社区 图像已经发展成人类沟通的视觉语言.无论传统互联网还是移动互联网,图像一直占据着 ...

  9. dedecms 封面模板和列表模板有什么不同

    封面模板,相当于你一个大栏目的封面.举例:你有一个栏目叫做"建站"而下面有很多子栏目,例如代码教程.模板下载.seo经验等,那么封面就相当于这个大栏目的首页,然后您可以在这个页面展 ...

  10. C#编写影院售票系统(A project with a higher amount of gold )(2:相关代码)

    此篇文章为项目代码,,,需要项目需求 ,思路分析与窗体效果请访问:http://www.cnblogs.com/lsy131479/p/8367304.html 项目类图: 影院类: using Sy ...