常用的两种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,修改即覆盖原值)。私有的内容被完好的保存在闭包内,当然无法被直接修改。因此这种方法能使内容获得真正的私有保护。