`

我的javascript学习之路(二) 对象之定义

阅读更多
javascript 是弱语言
我们学习javascript的时候 就不应该收到强类型语言规则的限制 强类型语言一般从数据结构(类)到对象(类的实例)2个角度来考虑问题,所以我们要实现动态增加类的属性或者方法都比较困难,连生成一个对象动态增加属性或者方法都比较困难,一般都需要装饰模式,最基本的动态生成一个实体bean,然后从数据map中把key对应的值赋给bean的该name属性都是开销比较大的事情,但是javascript就完全不一样了,我们应该在学习javascript的时候忘记java的等的这些概念,我们只需要知道javascript中只有对象!


//一、工厂方式

//可以看到第二个实例p2和person指向同一个对象,无法实现“类的功能”,只是一个对象。
var person = new Object();
person.name="sjf";
person.age=24;
person.showName=function(){alert(this.name);}
person.showName();//sjf
var p2 = person ;
p2.name='jianfeng';
p2.showName();//jianfeng
person.showName();//jianfeng
当然我们可以这样处理:

var p2 = new Object();
for(var p in  person){
   p2[p]=person[p] ;
}


//这种事情你用java你怎么来实现呢?所以说学习js的时候忘记java吧。





//二、工厂模式
缺点:
1、没有使用new;
2、showName放里面太浪费,放外面封装不好
function createPerson(name,age){	
	var person = new Object();
	person.name=name;
	//alert(this.name);
	person.age=age;
	person.showName=function (){alert(this.name);};
	return person;
}

var p1 = createPerson('sjf',24);
p1.showName();//sjf
for(var p in p1 ){
alert('key:'+ p + '==>value : ' + p1[p] );
}

var p2 = createPerson('jianfeng',42);
p2.showName();//jianfeng

p1.showName();//sjf

//请对比下面的代码

function createPerson(name,age){	

	this.name=name;
	//alert(this.name);
	this.age=age;
	this.showName=function (){alert(this.name);};
	return this;
}


var p1 = createPerson('sjf',24);
p1.showName();//sjf

/*
for(var p in p1 ){
alert('key:'+ p + '==>value : ' + p1[p] );
}
*/
var p2 = createPerson('jianfeng',42);
p2.showName();//jianfeng
p1.showName();//jianfeng

/*
从这个方法开始我们使用this
出现的结果是因为这里的this一直指向的是window对象 所有p1在第二次showName的时候变成最新的了 这样就每次把新生成的window对象赋给了p1和p2 这样做显然不是我们需要的哦,解决办法是:
var p1 = new  createPerson('sjf',24);
var p2 = new   createPerson('jianfeng',42);
等价于下面这种方法:定义对象,把这个函数赋给他 (这里是为了方便理解this指针的用法!),然后调用该对象的该函数。//前面的文章中已经讲过了
var p1 = new  Object();
p1.createPerson = createPerson;
p1.createPerson('sjf',24);

var p2 = new  Object();
p2.createPerson=createPerson;
p2.createPerson('jianfeng',42);

*/


//三、构造函数方式

缺点:
1、没有使用new;
2、showName放里面太浪费,放外面封装不好
function createPerson(name,age){	

	this.name=name;
	//alert(this.name);
	this.age=age;
	this.showName=function (){alert(this.name);};
	return this;
}


var p1 = new createPerson('sjf',24);

p1.showName();//sjf

/*
for(var p in p1 ){
alert('key:'+ p + '==>value : ' + p1[p] );
}
*/
var p2 = createPerson('jianfeng',42);

p2.showName();//jianfeng
p1.showName();//sjf

//四 构造函数/原型方式
缺点:
1、没有使用new; (解决)
2、showName放里面太浪费,放外面封装不好
function Person(name,age){	

	this.name=name;
	//alert(this.name);
	this.age=age;	
	return this;

}

Person.prototype.showName=function (){
	alert(this.name);
}


var p1 = new Person('sjf',24);

p1.showName();//sjf


for(var p in p1 ){
alert('key:'+ p + '==>value : ' + p1[p] );
}

var p2 = new Person('jianfeng',42);
p2.showName();//jianfeng
p1.showName();//sjf


///五、动态原型方法

缺点:
1、没有使用new; (解决)
2、showName放里面太浪费,放外面封装不好(解决)
function Person(name,age){	

	this.name=name;
	//alert(this.name);
	this.age=age;	
	//return this;
	if(typeof Person._initialized=='undefined'){
	
		Person.prototype.showName=function (){
			alert(this.name);
		}
		Person._initialized=true;
	}

}



var p1 = new Person('sjf',24);

p1.showName();//sjf


for(var p in p1 ){
alert('key:'+ p + '==>value : ' + p1[p] );
}

var p2 = new Person('jianfeng',42);
p2.showName();//jianfeng
p1.showName();//sjf

看到这里也许你会说 开头不是还有个属性拷贝的定义方法吗  是的 但是 针对具体的对象我们偶尔这样用是可以的,但是这只是针对个体的一种操作,就好比我们在java中用数据Map填充一个实体bean一样的道理 , 这里讨论的是更广意义上的类的定义,类似于java中如何定义具体的class,可以说是从数据结构为基础的角度来考虑的。





分享到:
评论
2 楼 sgwood 2007-09-16  
这个写得不错,支持一下
1 楼 jianfeng008cn 2006-09-22  
顶一下

相关推荐

    JavaScript学习深入—面向对象编程

    ### JavaScript学习深入—面向对象编程 #### 一、JavaScript中的类型概述 JavaScript作为一种动态的、弱类型的语言,其核心特点之一在于它灵活的对象模型。尽管JavaScript的基础架构支持面向对象编程(OOP),但在...

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

    Zakas编写,是面向对象编程领域中的权威指南之一,尤其针对JavaScript这门语言。作者深入浅出地介绍了面向对象编程的基本原理以及如何将这些原理应用于JavaScript中。 #### 二、面向对象编程基础 面向对象编程...

    JavaScript对象定义

    JavaScript对象定义是编程语言中的核心概念,它在Web开发中起着至关重要的作用。JavaScript是一种基于原型的对象导向语言,它的对象定义方式具有独特的灵活性。在本文中,我们将深入探讨JavaScript对象的定义、创建...

    JavaScript学习(一)

    JavaScript学习(一) JavaScript是一种广泛应用于网页和网络应用的脚本语言,由 Netscape 的 Brendan Eich 在1995年发明。它主要用于客户端的网页交互,赋予网页动态功能,如响应用户操作、处理数据、与服务器通信...

    JavaScript学习笔记之创建对象_.docx

    在JavaScript中,对象是核心概念之一,它们是无序属性的集合,允许我们存储和操作数据。对象的属性可以是基本值(如字符串、数字、布尔值)或更复杂的对象和函数,使得JavaScript具备强大的数据结构和面向对象编程...

    JavaScript学习指南 源代码

    本“JavaScript学习指南”源代码包含了深入理解并掌握JavaScript编程的关键知识点。 一、基础语法 JavaScript的基础语法包括变量声明(var、let、const)、数据类型(如字符串、数字、布尔值、null、undefined、...

    javascript对象参考手册

    首先,手册的前几章会介绍JavaScript对象的基础知识,包括对象的创建、属性和方法的定义,以及对象与数据类型的关联。JavaScript中的对象是基于原型的,这意味着它们可以通过原型链共享属性和方法。此外,还会讲解...

    javascript中的数组对象以及json学习笔记

    在JavaScript中,数组是对象的一种特殊类型,通过方括号[]来定义。例如: ```javascript var myArray = [1, "two", true, {name: "John"}]; ``` 数组有一些内置的方法和属性,如`length`用于获取数组长度,`push`...

    javascript面向对象编程.pdf

    总而言之,学习现代JavaScript面向对象编程,有助于开发者在认识这门语言演化的基础上,运用面向对象的设计和编程模式来构建更加健壮和可维护的JavaScript应用程序。同时,测试和调试是保证代码质量不可或缺的环节,...

    JavaScript面向对象编程指南.pdf

    当使用new关键字调用构造函数时,JavaScript引擎会创建一个新的空对象,并且按照构造函数中定义的属性和方法来初始化这个新对象。 3. prototype:在JavaScript中,每个函数都有一个prototype属性,这个属性指向一个...

    javascript 经典面向对象设计

    ### JavaScript经典面向对象设计 #### 标题与描述解析 标题“JavaScript经典面向对象设计”指出了本书的主要内容是关于如何使用面向对象编程(OOP)原则和技术来编写高质量、可扩展且可重用的JavaScript应用程序及...

    JavaScript学习帮助文档_JavaScript学习帮助文档_javascript_

    这份"JavaScript学习帮助文档"是专为初学者设计的,旨在帮助他们掌握JavaScript的基础知识和实际应用技巧。 首先,JavaScript的基本语法是学习的起点。它是一种基于原型的、动态类型的、弱类型的脚本语言。这意味着...

    JavaScript面向对象基础.ppt

    在JavaScript中,面向对象编程(OOP)是其核心概念之一,允许开发者通过类和对象来组织和管理代码,提高代码的可重用性和可维护性。 8.1 面向对象术语 面向对象编程的基础包括类、对象、继承和多态等概念。类是对象...

    Javascript权威指南学习笔记二

    ### JavaScript权威指南学习笔记二:客户端JavaScript #### 第十二章:Web浏览器中的JavaScript ##### 一、Web浏览器环境 在客户端JavaScript中,浏览器提供了一个特定的执行环境,其中`window`对象扮演着至关...

    JavaScript学习PPT(适合初学者)

    这份"JavaScript学习PPT"是专为初学者设计的,旨在帮助他们掌握JavaScript的基础概念和核心技能。 首先,JavaScript的核心构成包括变量、数据类型、控制结构、函数和对象。变量是存储数据的地方,JavaScript支持...

    javascript面向对象学习笔记

    JavaScript是一种基于原型和函数式编程的动态类型语言,面向对象编程是其核心概念之一。本文将深入探讨JavaScript中的面向对象编程,主要关注类、对象、以及实现继承的几种模式。 首先,我们来看对象的创建。在...

    javascript如何定义对象数组

    在JavaScript中,定义对象数组是将多个对象存储在一个单一的数组结构中,使得你可以方便地管理和操作一组具有相似属性的对象。下面将详细解释如何定义和使用JavaScript中的对象数组。 首先,我们回顾一下如何创建一...

    JavaScript学习资料全面整理

    本资源包"JavaScript学习资料全面整理"显然是为了帮助初学者和进阶者深入理解这门语言,包含了各种资源,下面将对JavaScript的一些关键知识点进行详细阐述。 1. **基础概念**:JavaScript是一种解释型、弱类型、...

Global site tag (gtag.js) - Google Analytics