JavaScript的两种面向对象方法--原型继承(prototype)和函数继承(闭包)


常用的两种JS继承和面向对象写法。

一、原型继承

使用prototype向对象绑定方法。

继承时在子类中使用call继承父类的构造方法,并使用new声明继承父类的方法。


var DemoParent = function (param1,param2) {
	this.attr1 = param1;
	this.attr2 = param2;
};

DemoParent.prototype.paFunc = function () {
	return 'attr1 is ' + this.attr1 + '; attr2 is ' + this.attr2;
};

var Demo = function (param) {
	this.newAttr = param;
	DemoParent.call(this,'Hello',param);
};

Demo.prototype = new DemoParent;

Demo.prototype.cFunc = function() {
	return 'newAttr is ' + this.newAttr;
};

var exDemo = new Demo('world');

var result = "exDemo.newAttr: " + exDemo.newAttr + "\n";

result = result + "exDemo.cFunc(): " + exDemo.cFunc() + "\n\n";
result = result + "exDemo.attr1: " + exDemo.attr1 + "\n";
result = result + "exDemo.attr2:" + exDemo.attr2 + "\n";
result = result + "exDemo.paFunc(): " + exDemo.paFunc();

alert(result);



结果为:



使用此方法时,对象的内部属性没有私有保护,是没有隐私和安全性的。

alert(exDemo.cFunc());
exDemo.newAttr = 'I change it';
alert(exDemo.cFunc());




二、闭包继承

另一个方法是使用闭包(Closure)。

这种方法基本就是函数的包装,模拟出类和对象的继承和传递特征,也只能说是类似于对象。

在父级函数体内包装一个包含其内容的that。在要获得继承的函数中调用,依赖闭包对局部变量的保存,通过return返回将内容和方法传递出来。


var demoParent = function (param1,param2) {
	var that = {
		attr2: param2,
		paFunc: function (){
			return 'param1 is ' + param1 + '; attr2 is ' + that.attr2;
		}
	};
	return that;
};


var demo = function (param) {
	var that = demoParent('Hello',param);
	that.cFunc = function () {
		return 'param is ' + param;
	};
	return that;
}


var exDemo = demo('world');


var result = "exDemo.param: " + exDemo.param + "\n";


result = result + "exDemo.cFunc(): " + exDemo.cFunc() + "\n\n";
result = result + "exDemo.param1: " + exDemo.param1 + "\n ";
result = result + "exDemo.param2: " + exDemo.param2 + "\n";
result = result + "exDemo.attr2:" + exDemo.attr2 + "\n";
result = result + "exDemo.paFunc(): " + exDemo.paFunc();


alert(result);



结果为:



由此得见:

由“父级”函数中继承,而未赋值传递的属性(param1,param2)为undefined,无法访问(即也无法修改),却能由设定的内部函数进行访问( paFunc ( ) );

由“父级”函数中继承并赋值传递的属性(attr2=param2)可被返问(因为传递出来了);

自身函数的参数也是相同的情况(exDemo.param:undefined这里就好理解了,函数体内的作用域,但能通过内部函数访问,因为返回了闭包)。

修改当然也是同样的道理,只有传递出来的公有变量可改(attr2,修改即覆盖原值)。私有的内容被完好的保存在闭包内,当然无法被直接修改。因此这种方法能使内容获得真正的私有保护。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值