JavaScript内核笔记07-面向对象

JavaScript是基于对象的而非基于类,但是,JavaScript的的函数式语言的特性使得它本身是可编程的,它可以变成你想要的任何形式。JavaScript的OO风格代码开发:

1、原型继承

JavaScript中的继承可以使用原型链来实现,调用对象上的一个方法,由于方法在JavaScript对象中是对另一个函数对象的引用,因此解释器会在对象中查找该属性,如果没有

找到,则在其内部对象prototype对象上搜索,由于prototype对象和对象本身的结构是一样的,因此这一个过程会一直回溯到发现该属性,则调用该属性,否则报告一个错误。

关于原型继承,如下例:

//原型继承
function Base()
{
	this.baseFunc=function()
	{
		alert("base behavior");
	}
}

function Middle()
{
	this.middleFunc=function()
	{
		alert("middle behavior");
	}	
}

Middle.prototype=new Base();//继承Base

function Final()
{
	this.finalFunc=function()
	{
		alert("final behavior");
	}	
}

Final.prototype=new Middle();//继承Middle

function test()
{
	var obj=new Final();
	obj.baseFunc();
	obj.middleFunc();
	obj.finalFunc();
}

test();

2、引用

JavaScript的应用和其他语言的不同之处在于,它的引用始终指向最终的对象,而非引用本身,如下例:

//引用实例
var obj={};//空对象
var ref=obj;
obj.name="objectA";
alert(ref.name);//ref也跟着增加了name属性

obj=["one","two","three","four"];//obj指向了另外一个对象(数组对象)
alert(ref.name);//ref还指向原来的对象
alert(obj.length);//3
alert(ref.length);//undefined 
//说明:<span style="font-size:18px;color:#ff0000;"><strong>obj只是对一个匿名对象的引用</strong></span>,因此,ref并非指向它,当obj指向另一个数组对象时可以看到,引用ref并没有改变。
//而始终指向那个后来添加了name属性的“空”对象{}。。<strong>修改obj的指向不回影响到ref,但是修改原对象的值,则会影响到其引用对象</strong>。


3、new操作符

采用new操作符定义function对象,可以实现类似java一样的对象创建。而对于json格式的对象则不能用new来创建,function(){}这种默认构造定义的对象则可以。

如:

var a={name:'name'};var b=new a();   不可行

var a=function(){alert('3');};var b=new a(); 可行


4、封装

事实上,我们可以通过JavaScript函数实现封装,封装的好处在于,未经授权的客户代码无法访问到我们不公开的数据,如下例:

//封装,共有、私有的定义
function Person(name)
{
	//私有变量private
	var address="China";
	
	//公有方法public
	this.getAddress=function()
	{
		return address;		
	}
	
	//共有变量public
	this.name=name;
}
//通过原型prototype扩展方法,共有方法
Person.prototype.getName=function()
{
	return this.name;
}
Person.prototype.setName=function(name)
{
	this.name=name;
}
<strong>Person.AGE=1000;//静态变量</strong>
/* 
说明:首先声明一个函数作为模板,用面向对象的术语来讲就是一个“类”,用var方式声明的变量仅在类内部可见,所以address是一个私有成员变量,
      访问address的唯一方式是,<strong>通过暴露出来的getAddress方法,而set/getName方法均为原型链上的方法</strong>,因此为公开的。测试如下: 
*/
var jay=new Person("jay");
alert(jay.name);//可以访问,返回:jay
alert(jay.getName());//可以访问,返回:jay
alert(jay.address);//无法访问,返回:undefined
alert(jay.getAddress());//可以访问,返回:China
<strong>alert(Person.AGE);//通过名字来访问</strong>


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值