`

JavaScript对象探讨

阅读更多
由于JavaScript的灵活性,可以让每个人按照自己的习惯进行编写代码.有函数式的编程方式,也有现在用的较为广泛的对象字面量.由于面向对象的出现,JavaScript刚开始的函数编程也逐渐演化为类式编程方式.现在我对几种比较熟悉的编程习惯进行简单的说明:
1.对象字面量:
var person = {
    name:null,
    setName:function(name){
        this.name = name;
        return this.name;
    },
    getName:function(){
        alert(this.name);
    }
}

具有JavaScript特色的一种编程方式,以类为单位含有属性name,方法setName和getName.调用方法比较简便person.setname('R'),this由此至终均指向person,person的属性与方法均不私有,可以进行调用.
2.prototype构造器调用模式
var Person = function(){
    this.name = null;
}
Person.prototype.setName = function(name){
    this.name = name;
}
Person.prototype.getName = function(){
    alert(this.name);
}

也是很常见的编程方式,创建一个Person类,然后利用prototype对类进行扩展,添加方法.与对象字面量最大区别在于,调用该类的方法时,必须先new(跟Java调用类相似).var p = new Person();p.getName();如果不用new,而直接创建,会产生错误.而且这种错误将不会报错,难以发现.错误的产生原因来自于this 指向Person.prototypel,而Person并没有setName方法.
3.利用匿名函数进行函数编程
(function(){
    var name;
         
    var setName = function(n){
         name = n;
    }
    window['person']['setName'] = setName;
   
    var getName = function(){
        alert(name);
    }
    window['person']['getName'] = getName;
})()

类的出现,其中一个最大的好处就是降低了全局变量的出现,但是如果你依旧习惯于函数式编程,没关系,只要创建一个匿名函数,进行闭包,就可以再里面进行函数编程,也不需要担心全局变量的出现.如上所看到的var name;在匿名函数外部是无法调用的,然后利用外部的变量来调用内部的函数,或者是变量.可以借此创建私有变量和私有方法.
4.类式编程(不知道取什么名)
var person = function(){
    var name = null;
    return{
        setName:function(n){
            name = n;
        },
        getName:function(){
            alert(name);
        }
    }
}


与对象字面量很相似,其不同之处在于抛开了this,和可以对方法与属性进行私有.调用方法与对象字面量基本一致.
5.方法链
var Person = function(){
    this.name = null;
}
Person.prototype = {
    setName:function(name){
        this.name = name;
        return this;
    },
    getName:function(){
        alert(this.name);
        return this;
    }
}

jQuery就是一个最经典的方法连库,如果还不懂方法链是什么,看看这个例子:
  var p = new Person();
    p.setName('Tom').getName().setName('Ray').getName();

由于每个方法的结尾都是return this;所以产生了方法链式的类.
本人比较熟悉的就是这几种方式了,每个人都有每个人的特色,所以方式也是说不尽的.但是借此,我想探讨以下几个问题:
1.有关于this指针

在建立多种类的时候都用到this,可是this的作用究竟是什么,而其实this在重用和继承上起着很大的作用.我们先看看一个关于继承的例子:
首先建立Person类:
var Person = function(){
    this.name = null;
}
Person.prototype.setName = function(name){
    this.name = name;
}
Person.prototype.getName = function(){
    alert(this.name);
}
Person.prototype.getAge = function(){
    var age = this.age || '';
    alert(age);
}

然后在建立一个Children类,并集成Person的所有方法和属性:
本人比较熟悉的就是这几种方式了,每个人都有每个人的特色,所以方式也是说不尽的.但是借此,我想探讨以下几个问题:

1.有关于this指针

在建立多种类的时候都用到this,可是this的作用究竟是什么,而其实this在重用和继承上起着很大的作用.我们先看看一个关于继承的例子:
首先建立Person类:

var Person = function(){
    this.name = null;
}
Person.prototype.setName = function(name){
    this.name = name;
}
Person.prototype.getName = function(){
    alert(this.name);
}
Person.prototype.getAge = function(){
    var age = this.age || '';
    alert(age);
}

然后在建立一个Children类,并集成Person的所有方法和属性:

var Children = function(age){
    this.name = null;
    this.age = age;
}
Children.prototype = new Person();    //继承Person的属性和方法
Children.prototype.ageJudge = function(){    //另外为Children添加新方法
    if(this.age > 18){
        alert('成年人~');
    } else {
        alert('未满18岁呢~');
    }
}
Children.prototype.getName = function(){    //重写getName方法
    var about = this.name + ' ' + this.age;
    alert(about);
}
var tom = new Children(12);
var ages = tom.getAge();    //12
var judge = tom.ageJudge();    //未满18岁呢~
var setN = tom.setName('Tom');
var get = tom.getName();    //Tom 12

这就是继承,然后我们看个简单的函数重用:

var SetColor = function(){
    this.style.backgroundColor = '#000';    //this指向window
}
document.body.onclick = SetColor;    //此时this指向body
documnet.getElementById('color').onmouseout = SetColor;        //this指向documnet.getElementById('color')

看了this的作用之后,想必对this有了新的认识了吧.现在就有疑问了,就是this的该用与不该用,下面在看个简单的例子:

var setColor = {
    init:function(obj){
        this.obj = obj;        //this指向setColor
        this.obj.onclick = this.color;
    },
    color:function(){
        this.style.backgroundColor = '#000';    //this指向obj
    }
}

就在一个类里,this却指向2处地方,有时这样总会让人觉得困惑.刚学习的人更会被this弄的晕头转向.而稍稍改变一下写代码的方式:

var setColor = {
    init:function(obj){
        setColor.obj = obj;       
        setColor.obj.onclick = setColor.color;
    },
    color:function(){
        this.style.backgroundColor = '#000';    //this可以方便方法的重用
    }
}

这样一下来,代码可以更加的清晰了.所以编写代码的时候应该考虑好究竟今后的用途,还有能否重用.如果明确了不进行继承或是重用,个人觉得应该尽可能的避免使用this,更有个比较常出现的问题.如下:

var Person = function(){
    this.name = null;
}
Person.prototype.setName = function(name){
    this.name = name;
}
Person.setName('tom');    //错误方式此时setName方法中的this将指向Person.prototypel,Person并没有setName方法

前面讲过,若果不写成var p = new Person();p.setName('tom');该类里的this将会直接指向Person.prototypel.这种错误在编译时,还是运行时都不会报错.有时会造成让人很头痛的问题.所以在编写代码时,我总是很慎重的选用this.

出处:蓝色理想
责任编辑:bluehearts

上一页 JavaScript对象探讨 [2] 下一页 JavaScript对象探讨 [4]

◎进入论坛网页制作、WEB标准化版块参加讨论,我还想发表评论。 

这就是继承,然后我们看个简单的函数重用:
var SetColor = function(){
    this.style.backgroundColor = '#000';    //this指向window
}
document.body.onclick = SetColor;    //此时this指向body
documnet.getElementById('color').onmouseout = SetColor;        //this指向documnet.getElementById('color')

看了this的作用之后,想必对this有了新的认识了吧.现在就有疑问了,就是this的该用与不该用,下面在看个简单的例子:
var setColor = {
    init:function(obj){
        this.obj = obj;        //this指向setColor
        this.obj.onclick = this.color;
    },
    color:function(){
        this.style.backgroundColor = '#000';    //this指向obj
    }
}

就在一个类里,this却指向2处地方,有时这样总会让人觉得困惑.刚学习的人更会被this弄的晕头转向.而稍稍改变一下写代码的方式:
var setColor = {
    init:function(obj){
        setColor.obj = obj;       
        setColor.obj.onclick = setColor.color;
    },
    color:function(){
        this.style.backgroundColor = '#000';    //this可以方便方法的重用
    }
}

这样一下来,代码可以更加的清晰了.所以编写代码的时候应该考虑好究竟今后的用途,还有能否重用.如果明确了不进行继承或是重用,个人觉得应该尽可能的避免使用this,更有个比较常出现的问题.如下:
var Person = function(){
    this.name = null;
}
Person.prototype.setName = function(name){
    this.name = name;
}
Person.setName('tom');    //错误方式此时setName方法中的this将指向Person.prototypel,Person并没有setName方法

前面讲过,若果不写成var p = new Person();p.setName('tom');该类里的this将会直接指向Person.prototypel.这种错误在编译时,还是运行时都不会报错.有时会造成让人很头痛的问题.所以在编写代码时,我总是很慎重的选用this.
2.类的封装
在Java里,对类的方法或是属性,可以设置为私有,这样就可以避免外部的调用,而JavaScript却不存在这样的设置,看看下面的代码:\
var person = {
    name:null,
    init:function(name){
        this.setName(name);
    },
    setName:function(name){
        this.name = name;
        return this.name;
    }
}
person.init('tom');    //tom

在这个类里,一共有2个方法,分别是init和setName,而我们只希望从init中运行setName,或是以后将会为里面添加的各种方法,而不希望出现:
person.setName('tom');    //tom

直接调用setName方法,正确的说,希望setName方法私有,还有name属性私有.避免别的程序员使用你的类时,调用了不想被调用的方法.
那应该怎么对类的封装好呢?试试另一种编程方式吧,看看改版的怎么样:
var person = function(){
    var name = null;
    var setName = function(n){
        name = n;
        return name;
    }
    return{
        init:function(n){
            setName(n);
        }
    }
}

这样子,就可以讲原本要私有化的方法和属性私有化了,外部无法直接调用了.这也是利用了闭包而达成所需要的方式的.可是这种编程方式不易于读,尤其是新手看到这种代码会很吃力,还有在占用内存方面也要比一般的高些.
好了,暂时先介绍到这里,下次有时间在说说闭包与作用域.
分享到:
评论

相关推荐

    javascript对象参考手册

    JavaScript对象是编程语言的核心组成部分,尤其在Web开发中扮演着至关重要的角色。"JavaScript对象参考手册"涵盖了这一主题的广泛内容,旨在为开发者提供全面、深入的理解和实用指南。手册分为20个章节,不仅涉及...

    deePool高效的JavaScript对象池

    DeePool通过实现JavaScript对象池,为开发者提供了一种优化内存使用、提高程序运行效率的有效手段。尤其在需要大量创建和销毁对象的场景下,使用DeePool可以显著提升性能,减少内存压力。掌握并合理运用DeePool,...

    深入浅出JavaScript对象模型

    ### 深入浅出JavaScript对象模型 #### JavaScript对象的本质 根据ECMA262规范,ECMAScript被定义为一种基于对象的语言而非传统的面向对象语言。这意味着在JavaScript中,对象被视为存储数据的一种大型数组形式,...

    面向对象JavaScript精要(英文原版pdf)

    - **第四章:继承**:探讨JavaScript中实现继承的不同方式。 - **第五章:封装和私有性**:讲解如何在JavaScript中实现封装以及保护私有数据的方法。 - **第六章:多态**:讨论多态性的概念及其在JavaScript中的应用...

    JavaScript对象定义

    在本文中,我们将深入探讨JavaScript对象的定义、创建方法以及相关的工具和技术。 首先,我们要了解JavaScript对象的本质。对象是由键值对(key-value pairs)构成的集合,这些键可以是字符串或符号,而值可以是...

    JavaScript对象经典小册 chm

    本小册"JavaScript对象经典小册 chm"深入探讨了JavaScript中的核心概念——对象和数组,旨在帮助开发者更好地理解和掌握这些基础知识。 一、JavaScript对象 1. 对象概述:JavaScript对象是一种数据结构,它由键值对...

    面向对象JavaScript开发

    JavaScript,作为一种广泛应用...JavaScript 面向对象程序设计——继承与多态.pdf 和 JavaScript 面向对象程序设计——封装.pdf 这两个文档可能深入探讨了这些主题,帮助读者深入理解并掌握JavaScript的面向对象开发。

    JavaScript对象模型-执行模型

    JavaScript对象模型(Object Model)和执行模型是理解JavaScript工作原理的关键概念。JavaScript是一种基于原型的动态类型语言,其对象模型是其核心特性之一。本文将深入探讨JavaScript的对象模型和执行模型,以及...

    javascript创建对象的方式(二)

    这里我们将深入探讨几种常见的创建对象的方式。 1. **构造函数**: JavaScript中的构造函数是一种特殊类型的函数,可以用来创建和初始化一个对象。通过`new`关键字调用构造函数,可以创建一个新的对象实例。例如:...

    JavaScript面向对象编程指南 pdf

    - JavaScript对象都有一个内置的`__proto__`属性,指向其构造函数的原型。原型是一个对象,可以包含共享的属性和方法。原型链允许对象访问其构造函数原型上的属性和方法。 - 使用`Object.prototype.isPrototypeOf...

    JavaScript面向对象编程指南(第2版).rar

    本指南的第二版深入探讨了JavaScript的面向对象特性,旨在帮助开发者更好地理解和应用这一编程范式。 JavaScript的面向对象主要基于三个核心概念:封装、继承和多态。封装是将数据和操作这些数据的方法结合在一起,...

    浅谈JavaScript对象之教学.pdf

    本文旨在探讨JavaScript对象的教学要点,旨在帮助高职软件技术专业的学生更好地理解和掌握JavaScript语言。文章从对象的概念、使用原生对象、原型链的理解、自定义对象的创建和新的语法规范五个方面对JavaScript对象...

    JavaScript核心对象参考手册

    本参考手册将深入探讨JavaScript的核心对象,帮助你更好地理解和运用这些对象。 一、全局对象Global 全局对象在JavaScript中扮演着特殊的角色,它是所有变量和函数的默认作用域。`window`是浏览器环境下的全局对象...

    javascript中数组、对象

    在JavaScript中,数组和对象是两种非常基础且重要的数据结构,它们被广泛应用于各种场景,如数据存储、逻辑处理和对象表示。这篇文章将深入探讨这两种数据类型,以及相关的操作和工具。 **一、数组** 数组在...

    JavaScript面向对象编程指南

    本指南将深入探讨JavaScript中的面向对象特性,包括类、对象、继承、封装和多态性。 1. **对象和对象字面量** JavaScript中的对象是键值对的集合,可以通过对象字面量{}来创建。例如: ```javascript let person...

    JavaScript面向对象精要(英文版)

    《JavaScript面向对象精要》这本书不仅介绍了JavaScript面向对象的基础概念,还深入探讨了其实现机制及其在实际开发中的应用。对于希望提高自己JavaScript技能水平的开发者来说,本书是一本不可多得的好书。通过学习...

    javascript对象大全

    首先,我们来探讨JavaScript对象的基本概念。在JavaScript中,对象是一种数据结构,它由键值对(key-value pairs)组成,键通常是字符串,而值可以是任何数据类型。对象是通过花括号{}创建的,例如:`var obj = {key...

Global site tag (gtag.js) - Google Analytics