`
blessdyb
  • 浏览: 235696 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

JavaScript 创建对象方法列举

 
阅读更多

      JavaScript 中没有类的概念,所以它的对象也与基于类的语言中的对象有所不同。创建一个JavaScript对象有如下的方式,由浅入深一 一列举对比。

 

  •       基础模式

      使用JavaScript中的Object来创建,如下代码:

 

 

var computer=new Object();
computer.color="White";
computer.brand="Apple";
computer.description=function(){
   console.log(this.brand+","+this.color+" computer");
};

 

       这种方式的缺点在于,如果创建很多对象,就需要有很多重复的代码,除了在测试及简单应用中使用上面的方式,基本很少使用了。

  •       工厂模式

       抽象出创建具体对象的过程,通过函数来间接生成对象,如下:

 

 

function createComputer(color,brand){
    var o=new Object();
    o.color=color;
    o.brand=brand;
    o.description=function(){
         console.log(this.brand+","+this.color+" computer");
    };
}


var macbookpro=createComputer("White","Apple");
var thinkpad=createComputer("black","IBM"); 

 

    使用这种设计模式解决了创建多个相似对象的问题,但由于是通过函数方式来生成对象,所以无法识别一个对象的类型。

 

  •      构造函数类型

    通过创建自定义的构造函数,在构造函数中定义对象的属性和方法,如下代码:

 

 

function Computer(color,brand){
    this.color=color;
    this.brand=brand;
    this.description=function(){
        console.log(this.brand+","+this.color+" computer");
    };
}

var macbookpro=new Computer("White","Apple");
var thinkpad=new Computer("black","IBM"); 

 

   可以看到,创建实例的时候,使用了关键字new操作符,这种方式的缺点就是每一个方法均需要在创建每一个实例的时候再创建一次。当然,我们可以把方法放在构造函数外面,通过函数变量指向外部方法来避免这个问题,但这样就破坏了OO的封装性,同时,所有的外部方法函数,均变为了"全局函数”。

   【注】在使用new创建一个新的实例的时候,经过四个步骤。创建一个新对象;将构造函数的作用域给新对象(此时this就会指向这个新对象);执行构造函数中的代码(为新对象添加属性);返回新对象.

 

  •     原型模式

    JavaScript中的每一个函数都有一个prototype属性,它可以包含由特定类型的所有实例共享的属性与方法,即生成一个让所有对象实例共享属性方法的原型对象类型。如下代码:

 

 

function Computer(){};
Computer.prototype.color="White";
Computer.prototype.brand="Apple";
Computer.prototype.description=function(){
   console.log(this.brand+","+this.color+" computer");
};

var macbookpro1=new Computer();
var macbookpro2=new Computer();

 

    即macbookpro1与macbookpro2两个变量访问同一组属性与方法。当然,上面的代码可以使用字面变量的方式重新写一下

 

 

function Computer(){};

Computer.prototype={
    constructor: Computer,
             color:"White",
           brand:"Apple",
   description:function(){
        console.log(this.brand+","+this.color+" computer");
   }
};

var macbookpro1=new Computer();
var macbookpro2=new Computer();
 

     【注】以上在字面变量中添加constructor属性,并将其指向Computer对象,是因为使用字面变量的方式整体重写了Computer.prototype对象,造成Computer.prototype.constructor不是指向默认的Computer对象。

 

    使用原型对象会有意想不到的效果,比如动态地添加一些属性。但同时,由于原型中所有属性是被很多实例所共享的,如果有属性是引用型的,那么只要在一个实例中改变这个引用型属性的值,所有其它的实例也会被影响。

 

  •      构造函数+原型模式

      结合这两种模式,可以使得每个实例都会有一份自已的实例属性副本,同时也共享对方法的引用,最大限度节省了内存。如下:

 

 

function Computer(color,brand){
    this.color=color;
    this.brand=brand;
};

Computer.prototype={
    constructor: Computer,
   description:function(){
        console.log(this.brand+","+this.color+" computer");
   }
};

var macbookpro=new Computer("White","Apple");
var thinkpad=new Computer("black","IBM"); 

 

    这种模式算是标准的模式了,如果觉得构造函数与原型分开定义了,可以使用动态原型,将原型放入构造方法中,如下:

 

 

function Computer(color,brand){
    this.color=color;
    this.brand=brand;

    if(typeof this.description != 'function'){
         Computer.prototype.description=function(){
             console.log(this.brand+","+this.color+" computer");
         };
    }
};

 

 

 

 

 

 

 

 

 

 

分享到:
评论
3 楼 woaixiangbao 2011-11-20  
woaixiangbao 写道
不过,在“原型模式”这里的两段代码,会不会有点问题?
function Computer(){}; 
最后面的呃大括号,是不是应该分开写的?比如:
function Computer(){
*****
}; 

哈哈哈,又仔细看了一下,好事没有问题的~~
2 楼 woaixiangbao 2011-11-20  
不过,在“原型模式”这里的两段代码,会不会有点问题?
function Computer(){}; 
最后面的呃大括号,是不是应该分开写的?比如:
function Computer(){
*****
}; 
1 楼 woaixiangbao 2011-11-20  
今天正好看到这部分了,来捧个场

相关推荐

    详解JavaScript基于面向对象之创建对象(2)

    标签“javascript面向对象 javascript创建对象”则明确告诉读者,文章将围绕JavaScript语言中面向对象编程的核心概念——对象的创建展开讨论。 内容部分详细解释了原型方式的核心原理和实现方法。在JavaScript中,...

    JavaScript 对象与数组参考大全

     本文列举了各种JavaScript对象与数组,同时包括对上述每一对象或数组所完成工作的简短描述,以及与其相关的属性方法,以及事件处理程序,还注明了该对象或数组的父对象用户同样可能需要参考Online Companion中的超级...

    Ajax基本对象的属性和方法

    Ajax 基本对象是指在异步 JavaScript 和 XML(AJAX)技术中使用的基本对象,该对象提供了一些属性和方法来处理 XML 的 DOM 元素和遍历 XML 的 DOM 元素。下面是 Ajax 基本对象的属性和方法的详细介绍: 属性 Ajax ...

    JAVASCRIPT中定义对象的几种方式.pdf

    `Object.create()`方法用于创建一个新对象,使用现有对象作为新创建对象的原型。 ```javascript let personProto = { greet: function() { console.log('Hello, my name is ' + this.name); } }; let person = ...

    JavaScript入门经典(第4版) Beginning JavaScript

    - **类与构造函数**:讲解了如何使用构造函数来创建对象实例,以及ES6中的class语法。 ##### 第6章:浏览器编程 - **DOM模型**:介绍了文档对象模型(DOM)的概念,以及如何通过JavaScript操作DOM元素。 - **事件...

    详细分析Javascript中创建对象的四种方式

    使用Javascript创建对象的方式有很多,现在就来列举一下其中的四种方式,并且罗列出了每种方式的优缺点,可以让大家进行选择使用,下面来看看。 工厂模式 function createPerson(name, age){ var obj = new ...

    [JavaScript进阶]Professional JavaScript for Web Developers(3rd)

    6. 面向对象编程(Chapter 6: Object-Oriented Programming):涵盖了JavaScript中的面向对象概念,包括对象创建、继承、原型链等。 7. 函数表达式(Chapter 7: Function Expressions):着重介绍了函数作为表达式...

    JavaScript网页设计300例

    这个压缩包中的核心资源是“JavaScript网页设计300例.chm”文件,这通常是一个帮助文档格式,里面详细列举了各个JavaScript实例。 JavaScript是一种广泛应用于网页开发的脚本语言,由Netscape公司的Brendan Eich于...

    《JavaScript学习指南(第2版)》[PDF]

    通过列举JavaScript应用的最佳实践和示例,本书展示了如何将该语言集成到浏览器环境中,及如何在符合标准的网站中应用这些已通过实践验证的编码技术。  本书内容:  JavaScript应用程序的结构,包括基本的语句和...

    javaScript(Useful).rar_javascript

    这份名为"javaScript(Useful).rar_javascript"的压缩包包含了一个文档,名为"107个常用Javascript语句.doc",其中详细列举了JavaScript编程中常见的107个语句,对于初学者来说是非常宝贵的资源。 首先,我们要了解...

    JavaScript学习指南(第2版).pdf

    《JavaScript学习指南(第2版)》通过列举JavaScript应用的最佳实践和示例,本书展示了如何将该语言集成到浏览器环境中,及如何在符合标准的网站中应用这些已通过实践验证的编码技术。 本书内容: ● JavaScript应用...

    JavaScript函数大全Word版

    该文档通过列举常见的JavaScript语法特性、内置对象和函数,帮助开发者快速掌握这门语言的核心概念和技术要点。 #### 二、详细知识点解析 ##### 1. 输出语句 `document.write` `document.write` 是一种基本的输出...

    javascript

    6. **对象**:详细说明JavaScript中对象的概念及其创建方式,如构造函数、对象字面量等。 7. **自定义对象**:教授如何定义自己的对象类,包括属性的设置和方法的添加。 8. **数组对象操作**:讲解数组的常用...

    javascript 设计模式 电子书 英文版

    - **第6章:工厂模式**:阐述了如何使用工厂模式来创建对象实例,以及如何优化代码使其更易于扩展。 - **第7章:单例模式**:解释了单例模式的概念,并演示了如何确保一个类只有一个实例。 - **第8章:装饰器模式**...

Global site tag (gtag.js) - Google Analytics