您的位置:首页 > Web前端 > JavaScript

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

2013-05-06 15:11 786 查看
常用的两种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,修改即覆盖原值)。私有的内容被完好的保存在闭包内,当然无法被直接修改。因此这种方法能使内容获得真正的私有保护。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: