`
18211103738
  • 浏览: 81165 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

JS创建对象和继承的方式

阅读更多

对象创建:

1.

//以下三种方法创建的对象是一样的,都是一个最普通的Object对象
var object = {}
var object = new Object();
var object = Object.create(Object.prototype);

 创建的对象如图:

 

2.

/*创建一个没有原型的空对象
 *这个新建的对象很可怜,他没有任何的原型
 *也就是说它连Object内置的方法都没有,不能toString(),valueOf等
 */
var object = Object.create(null);

  创建的对象如图:

 

3.

var point = { x : 1, y : 1}

  创建的对象如图:

 
 4.

var point = Object.create({ x : 1, y : 1});	//以{x:1,y:1}为原型创建一个对象

  创建的对象如图:

 

5.创建类:

   方式一

function Person(name, sex, age){
	this.name = name;
	this.sex = sex;
	this.age = age;
	
	this.say = function(){
		alert("My name is " + name);
	}
}

   方式二

var Person = {
	_name : null,
	_sex : null,
	_age : null,

	create : function(name, sex, age){
		var self = Object.create(this);
		self.setName(name);
		self.setSex(sex);
		self.setAge(age);

		return self;
	},
	say : function(){
		alert("My name is " + this.getName());
	},

	setName : function(name){
		this._name = name;
	},
	getName : function(){
		return this._name;
	},

	setSex : function(sex){
		this._sex = sex;
	},

	getSex : function(){
		return this._sex;
	},

	setAge : function(age){
		this._age = age;
	},
	
	getAge : function(){
		return this._age;
	}
}

 

对象继承:

 方式一:对象冒充(它们实质上是改变了this指针的指向)

    Person父类:

function Person(name, sex, age){
	this.name = name;
	this.sex = sex;
	this.age = age;
	
	this.say = function(){
		alert("My name is " + name);
	}
}

    1.Student子类(临时属性方式)

function Student(name, sex, age, stuNo){
	this.temp = Person;
	this.temp(name, sex, age);
	delete this.temp;
	
	this.stuNo = stuNo;
	this.show = function(){
		this.say();
		alert("My stuNo is " + stuNo);
	}
}

    2.Teacher子类(call()及apply()方式)

function Teacher(name, sex, age, subject){
	Person.call(this, name, sex, age);	//apply()方式改成Person.apply(this,new Array(name,sex,age,subject));
	
	this.subject = subject;
	this.show = function(){
		this.say();
		alert("I'm a teacher");
	}
}

 方式二:混合方式(成员变量采用对象冒充方式,成员方法采用原型链方式)

    Person父类:

function Person(name, sex, age){
	this.name = name;
	this.sex = sex;
	this.age = age;
}
Person.prototype.say = function(){
	alert("My name is " + this.name);
}
    President子类:
function President(name, sex, age, university){
	Person.call(this, name, sex, age);	//拷贝属性(通过this调用Person函数)
	this.university = university;
}
President.prototype = new Person();		//拷贝方法,原型指向实例(如果原型指向原型,则在子类中添加方法就相当于在父类中添加,如下面的show方法就会被直接添加到父类中)
//show方法的声明要写在President.prototype = new Person()后面
President.prototype.show = function(){
	alert("I'm the president of " + this.university + " University");
}
    测试:
var person = new Person("Janny", "female", 24);
//person.show();
person.say();
var president = new President("Same", "male", 54, "Yale");
president.show();
president.say();
 方式三:其它
var Person = Object.create(null,{	//创建一个Person类
	name : {value : null},
	sex : {value : null},
	age : {value : null},
	say : {value : function(){
		alert("My name is " + this.name);
	}}
});

var student = Object.create(Person, {	//创建一个student实例
	name : {value : "Tom"},
	sex : {value : "male"},
	age : {value : 22}
});
student.say();

var teacher = Object.create(Person, {	//创建一个teacher实例
	name : {value : "Jake"},
	sex : {value : "male"},
	age : {value : 34},
	show : {value : function(){
		alert("I'm a Teacher");
	}}
});
teacher.show();
teacher.say();
			
var Developer = Object.create(Person,{	////创建一个Developer类
	language : {value : null},
	show : {value : function(){
		alert("I'm a " + this.language + " programmer");
	}}
});
var deve = Object.create(Developer,{	//创建一个developer实例
	name : {value : "Ben"},
	sex : {value : "male"},
	age : {value : 28},
	language : {value : "Java"}
});
deve.say();
deve.show();
 
var Person = Object.create(null,{
	name : {value : null},
	sex : {value : null},
	age : {value : null},
	say : {value : function(){
		alert("My name is " + this.name);
	}}
});

var Student = function(_name, _sex, _age){	//这样创建一个类,可以使用new创建实例,但它将不再适合拥有子类
	return Object.create(Person, {
		name : {value : _name},
		sex : {value : _sex},
		age : {value : _age},
		show : {value : function(){
			alert("I'm a Student");
		}}
	});
}
var stu = new Student("Janny", "female", 24);	//new关键字创建实例效率较低
stu.say();
 
/*提示:JS中正确高效的创建一个对象的方法是Object.create,而非new*/
var Person = {	//创建一个Person类
	_name : null,
	_sex : null,
	_age : null,

	create : function(name, sex, age){
		var self = Object.create(this);
		self.setName(name);
		self.setSex(sex);
		self.setAge(age);
	
		return self;
	},

	say : function(){
		alert("My name is " + this.getName());
	},

	setName : function(name){
		this._name = name;
	},

	getName : function(){
		return this._name;
	},

	setSex : function(sex){
		this._sex = sex;
	},

	getSex : function(){
		return this._sex;
	},

	setAge : function(age){
		this._age = age;
	},

	getAge : function(){
		return this._age;
	}
}

var President = {	//创建一个President类
	_university : null,

	create : function(name, sex, age, university){
		var self = Object.create(Person, {	//以Person类为原型(就像继承了Person类)
			_university : {value : university},
			show : {value : President.show},
			setUniversity : {value : this.setUniversity},
			getUniversity : {value : this.getUniversity}
		});
	
		self.setName(name);
		self.setSex(sex);
		self.setAge(age);
		/*
		Person.setName.call(self,name);
		Person.setSex.call(self,sex);
		Person.setAge.call(self,age);
		*/
		return self;
	},
			
	show : function(){
		alert("I'm the president of " + this.getUniversity() + " University");
	},
	
	setUniversity : function(university){
		this._university = university;
	},

	getUniversity : function(){
		return this._university;
	}
}

var pres = President.create("Same", "male", 54, "Yale");
pres.say();
pres.show();
 
  • 大小: 2.5 KB
  • 大小: 2.6 KB
  • 大小: 3.5 KB
  • 大小: 4.7 KB
分享到:
评论

相关推荐

    javascript创建对象、对象继承的有用方式详解_.docx

    javascript创建对象、对象继承的有用方式详解_.docx

    JavaScript中创建对象和继承示例解读

    主要介绍了JavaScript中怎样创建对象和继承,需要的朋友可以参考下

    javascript创建对象、对象继承的实用方式详解

    JavaScript中的对象是基于原型的。原型是对象的基础,它定义并实现了一个新对象所必须包含的成员列表,并被所有同类对象实例所共享。...本文着重给大家介绍javascript创建对象、对象继承的实用方式

    javascript对象创建

    文章《javascript对象创建--类、继承》源码

    proto:一个基于原型的继承库,可以在不失去javascript原型系统的强大功能的情况下轻松创建对象和继承层次结构

    proto 一个基于原型的继承/类库,可以轻松创建对象和继承层次结构,而不会失去 javascript 原型系统的强大功能。为什么使用原型? proto很好用——你可以使用 proto 从任何对象继承,即使它是用不同的继承库创建的!...

    JavaScript继承

    在JavaScript中继承是一个非常复杂的话题,比其他任何面向对象的语言中的继承都复杂得多。在大多数其他面向对象语言中,继承一个类只需使用一个关键字即可。与它们不同,在JavaScript中要想达到传承公用成员的目的,...

    详解js创建对象的几种方法及继承

    主要介绍了js创建对象的几种方法及继承,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

    javascript创建对象—类,继承

    你甚至可以以键值对的方式来操作javascript中的对象,就像这样:跟这种方式创建对象的效果是一样的:显然,第二种访问方式更加方便.通常只有在并不确定我们访问的对象的属性名字的时候(比如json数据),才会使用这种...

    JavaScript创建对象方式总结【工厂模式、构造函数模式、原型模式等】

    本文实例总结了JavaScript创建对象方式。分享给大家供大家参考,具体如下: 这里主要是对《JavaScript高级程序设计》第六章(面向对象的程序设计)的总结,书上的这章至少看了4遍是有的。该章主要讲对象的创建与继承...

    js面向对象.pdf

    JavaScript 面向对象程序设计,最基础的介绍如何 创建对象, 继承,重原理上分析js,由浅入深,讲解的很清晰明白,希望能给大家的学习带来帮助

    JS 类的创建继承 与 new原理实现

    JavaScript深入之创建对象的多种方式以及优缺点 js new一个对象的过程,实现一个简单的new方法 (一)类的创建 1. 工厂模式 function createPerson(name){ //原料: var obj=new Object(); //加工: obj.name=name...

    一文理清 JavaScript 中对象的创建模式与继承模式

    一文理清 JavaScript 中对象的创建模式与继承模式 文章目录一文理清 JavaScript 中对象的创建模式与继承模式一、前言 :1. 写作目的2. 需要具备的知识点3. 阅前声明二、JavaScript 中对象的创建模式1. ( 单例模式 ) ...

    JavaScript创建对象的方式小结(4种方式)

    本文实例总结了JavaScript创建对象的方式。分享给大家供大家参考,具体如下: 潜意识里,JavaScript不能算是面向对象的语言,要算也只能说是趋向面向对象的一种语言,至少它不能很好的吻合面向对象最基本的三大特性...

    JavaScript对象创建及继承原理实例解剖

    本文将用实例讲解一下JavaScript对象创建及继承原理:JavaScript中的继承是使用原型链的机制,对象创建使用Function构造器,感兴趣的朋友可以详细了解下本文,或许可以帮助到你

    javascript面象对象编程

    函数对象和其它内部对象的关系 – 对于Function, Object, Array, Date, RegExp, Math, Error等内部对象 可使用new操作来返回一个对象实例 三、类 1. 实现 2. 公有成员,私有成员,静态成员 3. 类的继承

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

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

Global site tag (gtag.js) - Google Analytics