`

javascript面向对象编程----类的定义

阅读更多

最简单的javascript类的实现,

缺点所有属性都是公开的

 

window.onload = function() {
	var someone = new Person("someone");
	var sb = new Person("sb", 99);

	someone.setName("wod").setAge(100).showInfo();
	// alert(typeof Person);//function
	// alert(typeof someone);//object
};

/*******************************************************************************
 * class Person
 ******************************************************************************/
var Person = function(name, age) {
	if (name == undefined)
		throw new Error("构造器需要 name参数");

	this.setName(name);
	this.setAge(age);
};

Person.prototype = {
	getName : function() {
		return this.name;

	},
	setName : function(name) {
		this.name = name;
		return this;// 能够链式调用
	},
	getAge : function() {
		return this.age;

	},
	setAge : function(age) {
		if (age < 0 || age > 120)
			throw new Error("invalid Person age");// 简单check
		this.age = age || 20;// 构造器无age参数时,默认值20
		return this;

	},
	showInfo : function() {
		return this.name + "'s" + " age is " + this.age + " years old.";
	}
};

 

 

 

用闭包实现带有私有成员的类

 

window.onload = function() {
	var someone = new Person("t");
	var sb = new Person("sb", 99);

	var bbb = someone.setAge(12).showInfo();
	alert(bbb)
};

/*******************************************************************************
 * class Person
 ******************************************************************************/
var Person = function(newName, newAge) {
	if (newName == undefined)
		throw new Error("构造器需要 name参数");
	// -------------------private start-------------------
	// 私有属性
	var name, age;
	// 私有方法
	function checkAge(age) {

		if (age < 0 || age > 120) {
			throw new Error("invalid Person age");// 简单check
			return false;
		}
		return true;
	}
	// -------------------private end -------------------

	// -------------------public start-------------------
	// 特权方法(privileged methods),能够访问私有属性,需要访问私有属性的方法才设成特权方法
	this.getName = function() {
		return name;
	};

	this.setName = function(newName) {
		name = newName;
		return this;// 能够链式调用
	};

	this.getAge = function() {
		return age;
	};

	this.setAge = function(newAge) {
		checkAge(newAge)
		age = newAge || 20;// 构造器无age参数时,默认值20
		return this;
	};

	this.showInfo = function() {
		return name + "'s" + " age is " + age + " years old.";
	};
	//
	// 构造器
	this.setName(newName);
	this.setAge(newAge);
};

// 公开的不需访问私有属性的方法定义
Person.prototype = {

	method1 : function() {
		// ...
	},
};
// -------------------public end-------------------

 

 

 静态方法的定义

 

window.onload = function() {
	

	Person.staticMethod1();//静态调用
	Person.showPersonNum();
};

/*******************************************************************************
 * class Person
 ******************************************************************************/
var Person = (function() {

	// -------------------private start-------------------
	// private static attributes 私有静态属性
	var numOfPersons = 0;
	var numOfFingers = 10;
	// 私有静态方法

	function showFingerNum() {
		return numOfFingers;
	}

	var ctor = function(newName, newAge) {
		if (newName == undefined)
			throw new Error("构造器需要 name参数 constructor need a name");

		// 私有属性
		var name, age;
		
		// 私有方法(与定义在return外的私有静态方法用法上一样)
		function checkAge(age) {

			if (age < 0 || age > 120) {
				throw new Error("invalid Person age");// 简单check
				return false;
			}
			return true;
		}
		// -------------------private end -------------------

		// -------------------public start-------------------
		// 特权方法(privileged methods),能够访问私有属性,需要访问私有属性的方法才设成特权方法
		this.getName = function() {
			return name;
		};

		this.setName = function(newName) {
			name = newName;
			return this;// 能够链式调用
		};

		this.getAge = function() {
			return age;
		};

		this.setAge = function(newAge) {
			checkAge(newAge);
			age = newAge || 20;// 构造器无age参数时,默认值20
			return this;
		};

		this.showInfo = function() {
			return name + "'s" + " age is " + age + " years old."
					+ showFingerNum();
		};

		// 构造器
		numOfPersons++;
		this.setName(newName);
		this.setAge(newAge);
	};

	// public privileged static method 能够访问私有属性的静态方法;
	ctor.showPersonNum = function() {
		alert("there has "+numOfPersons+" Person been created");
	};
	return ctor;

})();
// public non-privileged static method 公开的不需访问私有属性的静态方法定义
Person.staticMethod1 = function() {
	alert("Person.staticMethod1");
};

// public, non-privileged methods 公开的不需访问私有属性的方法定义
Person.prototype = {
	method1 : function() {
		alert("method1");
	},
	method2 : function() {
		alert("method2");
	}
};
// -------------------public end-------------------
 
分享到:
评论

相关推荐

    javascript面向对象编程

    javascript 面向对象编程的若干问题,包括this指针,如何定义对象,如何继承等

    讲解JavaScript的面向对象的编程

    本人一行注释一行代码翻译了该大师的艺术作品--目的说明它是在第1,2阶段文档演示的JavaScript面向对象的书写方式的进一步改进,它是现代JavaScript面向对象编程方式(使用基本类来编码)的过渡代码--没有它就没有当今...

    JavaScript集锦

    面向对象编程 - 14 - 属性 - 14 - 方法 - 14 - (9)字符串对象 - 15 - (10)JavaScript Date(日期)对象 - 17 - 定义日期 - 17 - 操作日期 - 17 - 比较日期 - 18 - (11).Array(数组)对象 - 22 - 定义数组 - 23 ...

    JavaScript 面向对象编程(2) 定义类

    本文承接上一篇JavaScript面向对象编程(1) 基础。 上篇说过,JavaScript没有类的概念,需要通过函数来实现类的定义。先通过一个例子说明: 代码如下: function myClass() { var id = 1; var name = “johnson”; ...

    JavaScript面向对象程序设计中对象的定义和继承详解

    本文实例讲述了JavaScript面向对象程序设计中对象的定义和继承。分享给大家供大家参考,具体如下: 在面向对象的Javascript编程中,希望代码优雅有高效是非常重要的。javascript中不存在类的概念,只有对象。要想把...

    Javascript面向对象扩展库(lang.js)

    lang.js是Javascript面向对象编程的扩展库,支持包、类的定义和函数重载等功能,接口简洁规范,易用性强,压缩包内包含文档示例和带注释的源码,欢迎下载试用。

    worldwindjava源码-javascript-oop:面向对象编程和面向对象JavaScript

    中的面向对象编程 学习目标 使用构造函数生成特定类型的对象。 使用构造函数将属性附加到新对象。 回想一下在构造函数中定义方法的成本。 通过将自定义对象附加到原型来定义自定义对象的方法。 使用 ES6 类语法重构...

    javascript 原生态js类继承实现的方式

    我们还知道,面向对象编程有三个重要的概念 - 封装、继承和多态。 但是在JavaScript的世界中,所有的这一切特性似乎都不存在。 因为JavaScript本身不是面向对象的语言,而是基于对象的语言。

    Javascript编程 类的继承及封装:Class

    笔者历经多年javascript的开发,痛彻体会javascript面向对象编程的不便性,精心制作了一个类的定义与继承功能的js,实现了在javascript中对类的定义、继承、封装机制,主要功能特征包括:  一、 统一了类定义的语法...

    Javascript 面向对象编程(coolshell)

    这两天有个前同事总在问我Javascript面向对象的东西,所以,索性写篇文章让他看去吧,这里这篇文章主要想从一个整体的角度来说明一下Javascript的面向对象的编程。(成文比较仓促,应该有不准确或是有误的地方,请...

    JavaScript面向对象编程

    暂时放弃js框架吧开始写javascript的时候都是自己写,后来发现了prototype.js框架,发现很好用,就一直用的,他的对象创建方法被修改了,但很好用,再后来又转用jquery框架,受此框架影响,也不用自己创建类了,渐渐...

    写给大家看的面向对象编程书(第3版).[美]Matt Weisfeld(带详细书签).pdf

    本书是一部独具特色的面向对象技术著作。书中结合代码示例生动透彻地讲述了面向对象思想的精髓,让读者真正学会以对象方式进行思考。此外,本书还讨论了各种与面向对象概念密切相关的应用主题,包括XML、UML建模语言...

    学习Javascript面向对象编程之封装

    主要帮助大家学习Javascript面向对象编程之封装,由浅入深的介绍了封装的概念定义,感兴趣的小伙伴们可以参考一下

    javascript 面向对象编程基础 多态

    Javascript已经可以模拟出面向对象的封装和继承特性,但是不幸的是Javascript对多态特性的支持非常弱!其它面向对象语言的多态一般都由方法重载和虚方法来实现多态,Javascript也通过这两种途径来实现! 重载:由于...

    javascript面象对象编程

    面向对象思想中,最核心的概念之一是类。 类:对一组属性及方法的集合。 二、函数 函数定义方法 函数声明后加括号 – 创建完成后立即调用执行 函数对象和其它内部对象的关系 – 对于Function, Object, Array, Date...

    javaScript函数式编程

    JavaScript 是近年来非常受瞩目的一门编程语言,它既支持面向对象编程,也支持函数式编程。本书专门介绍JavaScript函数式编程的特性。 全书共9章,分别介绍了JavaScript函数式编程、一等函数与Applicative编程、变量...

    1.JavaScript面试真题-210页.pdf

    面向对象编程:JavaScript支持面向对象编程范式,可以使用构造函数和原型链来定义和扩展对象。但它也是一门多范式语言,支持函数式编程和事件驱动编程。 动态类型:JavaScript是一种动态类型语言,变量无需声明类型...

    oo-relations

    面向对象关系 探索 JavaScript 面向对象编程 - 定义对象关系。

    JavaScript_oo:javascript面向对象

    对象在面向对象编程中,类是对象的模板,对象就是类的实例,例如“狗”是一个类,而这只狗就是一个对象,这只叫“hello dog”的狗就是一个实例。如何定义类1. 构造函数法这是经典方法,也是教科书必教的方法。它用...

Global site tag (gtag.js) - Google Analytics