转载: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. hdu_4869(费马小定理+快速幂)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4869 Turn the pokers Time Limit: 2000/1000 MS (Java/O ...

  2. 记忆化搜索 dp学习~2

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1331 Function Run Fun Time Limit: 2000/1000 MS (Java/ ...

  3. Zabbix安装客户端agent(windows和Centos7)

    上一篇简单的介绍了怎么搭建Zabbix监控服务端,接下来给大家介绍怎么在windows和Centos7上安装zabbix_agent客户端. Zabbix是一个基于WEB界面的提供分布式系统监视以及网 ...

  4. nodeJs文件系统(fs)与流(stream)

    一.简介 本文将介绍node.js文件系统(fs)和流(stream)的一些API已经参数使用情况. 二.目录 文件系统将介绍以下方法: 1.fs.readFile 2.fs.writeFile 3. ...

  5. JS——判断一个对象是否为空

    判断一个对象是否为空对象,本文给出三种判断方法: 1.最常见的思路,for...in...遍历属性,为真则为"非空数组":否则为"空数组" 2.通过JSON自带 ...

  6. VIM 文件搜索与替换

    文件内搜索与替换 :[range]s/pattern/string/[c,e,g,i] 例如: :%s/oldword/newword/cg //对文本中全部匹配进行替换 :m,ns/oldword/ ...

  7. Laravel5中使用阿里大于(鱼)发送短信验证码

    在做用户注册和个人中心的安全管理时,我实现借助第三方短信平台(阿里大于(鱼))在Laravel框架中进行手机验证的设置:阿里大于,是阿里通信旗下优质便捷的云通信服务平台,整合了三大运营商的通信能力,为 ...

  8. win7、win10进程pid4占用80端口的解决办法

    https://jingyan.baidu.com/article/7e4409533ffe092fc1e2ef10.html 今天想用wamp架设服务器,但是程序启动不起来,查看系统端口,80端口被 ...

  9. Html5+js测试题【完整版】

    一.闭包的理解:使用闭包主要是为了设计私有的方法和变量.闭包的优点是可以避免全局变量的污染,缺点是闭包会常驻内存,会增大内存使用量,使用不当很容易造成内存泄露.闭包三个特性: 1.函数嵌套函数 ; 2 ...

  10. asp.net -mvc框架复习(6)-基于MVC实现简单计算器

    1.创建好文件夹 2.视图层代码编写 <%@ Page Language="C#" Inherits="System.Web.Mvc.ViewPage<dyn ...