继承——代码重用

Posted 茂树24

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了继承——代码重用相关的知识,希望对你有一定的参考价值。

     

 

 

javascript中如何实现继承

 

1.1类式继承

<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>类式继承</title>
</head>
<body>
<script>
//class person
var Person = (function ()

	var Person = function (name)
		this._name;

		this.setName(name);
	;

	Person.prototype.setName = function (name)
		if(typeof name !=='string')
			throw new Error("Person类的属性name必须是string类型!");
		else
			this._name = name;
		
	;
	Person.prototype.getName = function ()
		return this._name;
	;

	return Person;
)();

function extend(subClass,superClass)
	var F = function();
	F.prototype = superClass.prototype;
	subClass.prototype = new F();
	subClass.prototype.constructor = subClass;

	//使得在子类中的构造函数或公共函数可以不依赖与父类进行调用
	subClass.superClass = superClass;
	if(superClass.prototype.constructor == Object.prototype.constructor)
		superClass.prototype.constructor = superClass;
	

//class Author extend Person
var Author = (function ()

	var Author = function (name, books)
		//调用父类Person的构造函数
		/*Person.call(this,name);*/
		this.superClass.call(this,name);

		this._books;

		this.setBooks(books);
	;

	extend(Author,Person);

	Author.prototype.setBooks = function (books)
		if(typeof books !== 'string')
			throw new Error("Author类的属性books必须是string类型!");
		else
			this._books = books;
		
	;
	Author.prototype.getBooks = function ()
		return this._books;
	;
	Author.prototype.getName = function ()
		var name = this.superClass.prototype.getName.call(this);
		return name +" Author of"+this._books;
	;


	return Author;
)();







</script>
</body>
</html>
 

1.2原型继承

 

<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>原型继承</title>
</head>
<body>
<script>
//原型继承兼容
Object.prototype.create = Object.prototype.create || function (proto,properties)
	if(typeof proto !== 'Object' && typeof proto !== 'function')
		throw typeError("将要创建对象的原型必须是object类型或者是null");
	
	function f();
	f.prototype = proto;
	var obj = new f();

	if(typeof properties !== undefined)
		Object.defineProperties(this,properties);
	

	return obj;
;

//对于私有的属性 可以通过特性函数对他设置,由于属性的特性设置数据类型的属性将会在这个对象中设置
//但是对于公共的属性来说继承而来特别是对象类型的属性,只能访问不能设置否则这一类属性之间不能共享
//解决办法深度克隆
function deepClone(obj,cloneObj,property)
	if(typeof obj !=="object" && typeof obj !== 'function')
		throw new Error("第一个参数必须是对象类型");
	
	if(typeof cloneObj !=="object" && typeof cloneObj !== 'function')
		throw new Error("第二个参数必须是对象类型");
	
	if(property)
		if(!Array.isArray(property))
			throw new Error("第三个参数必须是Array类型");
		for(var i = 0; i<property.length; i++)
			setProperty(property[i]);
		
	else
		for(var prop in cloneObj)
			if(cloneObj.hasOwnProperty(prop))
				setProperty(prop);
			
		
	
	
	function setProperty(prop)
		var val = cloneObj[prop];
			if(typeof val !== "object")
				obj[prop] = val;
			else
				
				if(Array.isArray(val))
					obj[prop] = [];
				else
					obj[prop] = ;
				
				deepClone(obj[prop],val);
			
		


var p = 
	w:23,
	name:
		ar:[1,2,3],
		b:
			c:34
		
	


//定义Person类
var Person = (function()
	var Person = 
		_name:"!private property",

		getName:function()
			return this._name;
		,
		setName:function(name)
			if(typeof name !== 'string')
				throw new Error(Person类的name属性必须为string类型);
			
			this._name = name;//让这个属性都添加到对象中去防护属性的读写不同意
		
	;
	Person.constructor = Person;
	return Person;
)();

var p1 = Object.create(Person);
p1.setName("maotr");

var Author = (function()
	var Author = Object.create(Person);
	Author._books = "!private property";
	Author.getBooks = function()
		return this._books;
	;
	Author.setBooks = function(books)
		if(typeof books !== "string")
			throw new Error(Author类的books属性必须为string类型);
		
		this._books = books;//让这个属性都添加到对象中去防护属性的读写不同意
	;
	return Author;
)();





</script>
</body>
</html>

这里的deepClone函数可以还可以实现多继承,只不过是在被继承的对象的prototype中添加集成几个对象的方法。

 

以上是关于继承——代码重用的主要内容,如果未能解决你的问题,请参考以下文章

Sass代码重用----Sass继承

仅用于代码重用c ++的继承

多态的作用

python-继承与重用

类的继承和重用

JAVA代码重用机制复用类之继承语法(附源码)