`
zha_zi
  • 浏览: 592758 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

js 面向对象学习6 几种面向对象写法的对比

 
阅读更多

方法一

var o=new Object();
o.age=20;
o.name="lisa";
o.showName=function(){
    console.log(this.name);
}

 这种写法创建了一个对象o 给o添加属性和方法,看似没有问题但是在创建多个o 就需要重复的给o添加属性,所以这种写法是较为不通用的一种写法,

方法二

   很多人想到干脆用工厂创建o 就可以解决o无法重复创建问题代码如下

function createPerson(age,name){
    var o=new Object();
    o.age=age;
    o.name=name;
    o.showName=function(){
        console.log(this.name);
    }
    return o;
 }

 这样解决了重复创建对象的问题,通过createPerson 这个工厂就可以创建多个不同的对象,每个都有不同age属性,不同name属性,但是showName在每个创建对象的时候也会穿件一个新的方法模板,是不是有点浪费内存

 

所有就有以下的改造方法把showName单独提取出来代码如下

function createPerson(age,name){
    var o=new Object();
    o.age=age;
    o.name=name;
    o.showName =showName;
    return o;
 }
function showName(){
     console.log(this.name);

}

如此这番的改造就解决showName方法多次创建的问题,也节约了内存,是不是很奇怪,感觉写习惯面向对象代码的人看着这些是不是非常不习惯的。

 

方法三

通过构造方法构建对象代码如下

function Person(age,name){
    this.age=age;
    this.name=name;
    this.showName=function(){
           console.log(this.age);
    }
}
var p1=new Person(12,"lisa");
var p2=new Person(15,"lee");

 观察以上代码区别,这个person 中是没有new Object() 和返回值的,所有Person 就是一个构造器,用来构造Person对象这种写法同样是没有解决showName多次创建的问题,解决方法也是跟上边是一样的只有提取出showName方法

 

方法四

 通过prototype属性构建对象代码如下

function Person(){}
Person.prototype.age=12;
Person.prototype.name="lee";
Person.prototype.pArray=new Array();
Person.prototype.showName=function(){
           console.log(this.name);
};

var p1=new Person();
p1.pArray.push("sa");
var p2=new Person();
console.log(p1.showName===p2.showName);//true
console.log(p1.pArray[0]);//sa
console.log(p2.pArray[0]);//sa
 
 

了解prototype属性就应该知道每个创建的person对象都会自动拥有age name 属性和showName 方法而且 这种写法有一个好处就是解决了showName重复创建的问题,但是两个新问题也随之而来,无法使用构造器传递参数,如Person(23,"sa"),更要命的是如果属性是引用类型的所有创建的对象都会持有同一个引用 所以就导致了 pArray 值都是一样,如何解决这个问题?

 

方法五

混合模式 prototype +构造器同时创建对象代码如下

function Perosn(age,name){
     this.age=age;
     this.name=name;
     this.array=new Array();
}
Person.prototype.showName=function(){
     console.log(this.name);
}

 如此这般就同时规避了以上的两个问题。而且可以用instanceof 得知对象。

方法六

 方法五其实已经没有硬伤了,但是开发者会感觉代码不够优美,所以就诞生了动态原型方法,代码如下

function Person(age,name){
       this.age=age;
       this.name=name;
       if(typeof Person._initialized=='undefined'){
             Person.prototype.showName=function(){
                     console.log(this.name);
             }
             Person._initialized=true;
        }
}
 

开发者经过大量的实践在js面向对象编程中发现的比较科学的方法。

 

 

分享到:
评论
1 楼 xl_0037 2013-05-10  
问题?
  

相关推荐

    js面向对象的写法

    本文归纳了js面向对象的几种常见写法,分享给大家供大家参考,具体内容如下 1.工厂方式 var Circle = function() { var obj = new Object(); obj.PI = 3.14159; obj.area = function( r ) { return this.PI * ...

    归纳下js面向对象的几种常见写法总结

    本文将总结几种常见的JavaScript面向对象编程的写法。 首先,我们可以使用工厂模式来创建对象。工厂模式是一种常用的模式,它通过一个函数来创建对象,并返回这个新创建的对象。工厂函数可以包含任意数量的参数,...

    js面向对象游戏开发,飞机大战

    本项目"js面向对象游戏开发,飞机大战"是利用JavaScript的面向对象特性来实现的一款简单游戏,非常适合初学者入门学习。 首先,我们要理解面向对象的基本概念。面向对象编程基于“对象”的思想,每个对象都包含数据...

    原生js实现无缝轮播(包括面向对象的写法)

    本教程将深入探讨如何使用原生JavaScript实现一个无缝轮播效果,同时结合面向对象编程思想进行代码组织,提高代码复用性和可维护性。 ### 1. 基本思路 无缝轮播的核心在于通过改变图片的位置或CSS属性,使得用户...

    JS 面向对象的5钟写法

    规范性:较为规范,是JavaScript中比较传统的面向对象写法。 第二种写法是使用即时函数(Immediately Invoked Function Expression, IIFE)结合原型链: ```javascript var Circle = function() { var obj = new ...

    js面向对象之常见创建对象的几种方式(工厂模式、构造函数模式、原型模式)

    JavaScript是一种基于原型的面向对象语言,它提供了多种创建对象的方式。在JS中,面向对象编程主要涉及类的概念、实例化和继承。本文将探讨三种常见的创建对象的模式:工厂模式、构造函数模式和原型模式。 ### 工厂...

    JavaScript碎片—函数闭包(模拟面向对象)

    JavaScript中实现面向对象的几种常见写法如下: 1. 使用prototype属性定义的方法是属于原型对象的方法,必须通过实例化对象后才能使用。这些方法可以使用this关键字来访问实例对象的其他属性。 2. 直接使用...

    Javascript 面向对象 对象(Object)

    ### JavaScript面向对象编程之对象(Object) #### 一、引言 JavaScript 作为一种广泛使用的脚本语言,在 Web 开发中占据着举足轻重的地位。它不仅支持传统的过程式编程,还具备面向对象编程(OOP)的能力。面向对象...

    JavaScript类的写法

    早期的javascript需求都很简单,基本都是写成函数的,然后是面向过程的写法,后来慢慢的引入面向对象开发思想,再后来就慢慢写成类。 在js中,写成类的本质基本都是 构造函数+原型。下面,就讨论一下js类的几种写法...

    javascript如何创建对象

    JavaScript是基于对象的语言,其能够利用面向对象思想来模拟其他如JAVA、C++等面向对象语言。面向对象编程关注的是解决问题所需的对象及其业务逻辑和方法,而面向过程则关注解决问题的步骤。在JavaScript中,对象...

    CKevens#-#05-02.面向对象:类的定义和继承的几种方式1

    前言类与实例:类的声明生成实例类与继承:如何实现继承:继承的本质就是原型链继承的几种方式类的定义、实例化类的定义/类的声明方式一:用构造函数模拟类(传统写法)/

    haoyi2015#Web-1#05-02.面向对象:类的定义和继承的几种方式1

    前言类与实例:类的声明生成实例类与继承:如何实现继承:继承的本质就是原型链继承的几种方式类的定义、实例化类的定义/类的声明方式一:用构造函数模拟类(传统写法)/

    【JavaScript源代码】详解ES6实现类的私有变量的几种写法.docx

    随着ECMAScript 2015(通常称为ES6)的引入,JavaScript语言经历了一次重大更新,提供了许多新特性和改进,其中包括对面向对象编程的支持增强。其中一项重要的功能是类的定义与使用。在面向对象编程中,私有变量是一...

    javascript对象的创建和访问_.docx

    创建JavaScript对象主要有以下几种方法: 1. **对象字面量(Object Literal)**: ```javascript var foo = {}; ``` 这是最简单的创建空对象的方式。然后可以通过点运算符或方括号语法添加属性: ```...

    javaScript中封装的各种写法示例(推荐)

    今天,我就来谈谈js写法,我在开发过程中,也写了几种。对于性能方面,如果代码结构或逻辑写的不好,会造成计算机CPU的运算加大,运行性能降低,js的写法对性能的影响也是至关重要的。 通常写js组件开发的,都会用到...

    javaScript封装的各种写法

    接下来,我们将详细探讨JavaScript封装的几种常见写法,并分析它们的优缺点及其适用场景。 首先,最基础的封装方法是使用函数。通过函数,我们可以将变量和逻辑封装起来,避免全局变量污染。这种方式在需要进行简单...

    javascript17

    6. **类与继承**:虽然JavaScript一直以来都有面向对象的能力,但在ES6中,正式引入了`class`关键字,提供了更接近传统面向对象语法的写法,但其本质仍然是基于原型的继承。 在Web开发中,JavaScript不仅用于前端...

    js对象实例详解(JavaScript对象深度剖析,深度理解js对象)

    JavaScript作为一种基于对象的语言,不像其他传统面向对象语言那样拥有类的概念,但在处理对象方面却有着独特的设计。在JavaScript中,对象可以是通过字面量创建的简单对象,也可以是通过函数创建的实例对象。本文将...

    在javascript中创建对象的各种模式解析_.docx

    本文主要解析了JavaScript中几种常见的创建对象的模式,包括工厂模式、构造函数模式、原型模式以及它们的组合和动态原型模式。 首先,JavaScript是一门基于原型的面向对象语言,它没有传统的类概念。对象是通过引用...

Global site tag (gtag.js) - Google Analytics