JavaScript的两种面向对象方法--原型继承(prototype)和函数继承(闭包)
2013-05-06 15:11
786 查看
常用的两种JS继承和面向对象写法。
一、原型继承
使用prototype向对象绑定方法。
继承时在子类中使用call继承父类的构造方法,并使用new声明继承父类的方法。
结果为:
使用此方法时,对象的内部属性没有私有保护,是没有隐私和安全性的。
二、闭包继承
另一个方法是使用闭包(Closure)。
这种方法基本就是函数的包装,模拟出类和对象的继承和传递特征,也只能说是类似于对象。
在父级函数体内包装一个包含其内容的that。在要获得继承的函数中调用,依赖闭包对局部变量的保存,通过return返回将内容和方法传递出来。
结果为:
由此得见:
由“父级”函数中继承,而未赋值传递的属性(param1,param2)为undefined,无法访问(即也无法修改),却能由设定的内部函数进行访问( paFunc ( ) );
由“父级”函数中继承并赋值传递的属性(attr2=param2)可被返问(因为传递出来了);
自身函数的参数也是相同的情况(exDemo.param:undefined这里就好理解了,函数体内的作用域,但能通过内部函数访问,因为返回了闭包)。
修改当然也是同样的道理,只有传递出来的公有变量可改(attr2,修改即覆盖原值)。私有的内容被完好的保存在闭包内,当然无法被直接修改。因此这种方法能使内容获得真正的私有保护。
一、原型继承
使用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,修改即覆盖原值)。私有的内容被完好的保存在闭包内,当然无法被直接修改。因此这种方法能使内容获得真正的私有保护。
相关文章推荐
- 实现javaScript对象的"继承"的两种方法(prototype与闭包)
- 深入理解javascript原型和闭包(3)——prototype原型
- javascript学习笔记(九)javascript中的原型(prototype)及原型链的继承方式
- JavaScript原型、函数伪装(apply,call)、继承
- 深入理解javascript原型和闭包(2)——函数和对象的关系
- javascript原型继承中的两种方法对比
- JavaScript的模块化:封装(闭包),继承(原型) 介绍
- 深入理解javascript原型和闭包(6)——继承
- 深入理解javascript中函数的prototype属性(原型)
- JavaScript的模块化:继承(原型)、封装(闭包)、多态
- 学习javascript的闭包,原型,和匿名函数之旅
- 学习javascript的闭包,原型,和匿名函数之旅
- 史上最通俗易懂的关于JavaScript 的 prototype、原型继承、this指针的讲解
- javascript继承—prototype最优两种继承(空函数和循环拷贝)
- Javascript原型与继承【prototype】
- 从零开始学_JavaScript_系列(20)——js系列<7>(函数原型的两种声明方式、函数的作用域)
- JavaScript原型、函数伪装(apply,call)、继承
- 变量对象,作用域链,闭包,匿名函数,this关键字,原型链,构造器,js预编译,对象模型,执行模型,prototype继承
- 深入理解javascript原型和闭包(6)——继承
- javascript继承—prototype最优两种继承(空函数和循环拷贝)