JavaScript构造函数和普通函数
2016-07-08 15:30
507 查看
构造函数和普通函数在定义时,只有一点差别,即是this,使用了this的即为构造函数,如下
function PT(){
var name="普通";
return name;
}
function GZ(){
this.name="构造";
return name;
}
[align=left]PT.prototype.sayHello = function () {[/align]
[align=left] alert( '普通!' );[/align]
[align=left] }[/align]
[align=left]GZ.prototype.sayHello = function () {[/align]
[align=left] alert( '构造!' );[/align]
[align=left] }[/align]
[align=left]
[/align]
var pt =
new PT();
var gz =
new GZ();
[align=left]
[/align]
[align=left]通过Chrome调试可以观察到[/align]
[align=left][/align]
[align=left]看到这个的时候,突然觉得这2个东西好像是一样的,仅仅只是其中一个多了name,[/align]
[align=left]所以我先假设了一个结论,普通函数就相当于没有公共属性和公共方法的构造函数![/align]
[align=left]
[/align]
为了验证这个假设,可以先试试将构造函数用调用普通函数那样的方式去调用,比如上面这个PT(),我们一般这样调用
var pt = PT();//普通
用构造函数试试
var gz=GZ();//构造
所以将构造函数当做普通函数用是没有问题的!
那么反过来呢?上面说到普通函数就相当于没有公共属性和公共方法的构造函数!
这里说到了公共属性和公共方法,因为我刚开始学JS,不知道这样的描述正不正确,C#里面叫做属性和方法,我们暂且这样叫吧
我们把上面的函数改造一下
[align=left] function PT() {[/align]
var name =
"普通" ;
[align=left] var age = 10;[/align]
[align=left]
[/align]
[align=left] var getName=function () {[/align]
[align=left] alert(name);[/align]
[align=left] }[/align]
[align=left]
[/align]
[align=left] var getAge=function () {[/align]
[align=left] alert(age);[/align]
[align=left] }[/align]
[align=left]
[/align]
[align=left] return name;[/align]
[align=left] }[/align]
[align=left]
[/align]
[align=left] function GZ() {[/align]
this .name =
"构造" ;
[align=left] var age = 20;[/align]
[align=left]
[/align]
this .getName=
function () {
[align=left] alert(name);[/align]
[align=left] }[/align]
[align=left]
[/align]
[align=left] var getAge=function () {[/align]
[align=left] alert(age);[/align]
[align=left] }[/align]
[align=left]
[/align]
[align=left] return name;[/align]
[align=left] }[/align]
[align=left]
[/align]
[align=left]再测试一下[/align]
var pt =
new PT();
var gz =
new GZ();
[align=left] alert("pt:name=" + pt.name +",age=" + pt.age); //pt:name=undefined,age=undefined[/align]
[align=left] //pt.getName(); //pt.getNameis not a function[/align]
[align=left] //pt.getAge(); //pt.getAgeis not a function[/align]
[align=left] alert("gz:name=" + gz.name +",age=" + gz.age); //gz:name=构造,age=undefined[/align]
[align=left] gz.getName();[/align]
//gz.getAge();
//gz.getAge
is not a function
[align=left][/align]
从上面的结果可以看出和我们之前得出的结论一样,即便是在构造函数里,也不是所有的都能访问。
function PT(){
var name="普通";
return name;
}
function GZ(){
this.name="构造";
return name;
}
[align=left]PT.prototype.sayHello = function () {[/align]
[align=left] alert( '普通!' );[/align]
[align=left] }[/align]
[align=left]GZ.prototype.sayHello = function () {[/align]
[align=left] alert( '构造!' );[/align]
[align=left] }[/align]
[align=left]
[/align]
var pt =
new PT();
var gz =
new GZ();
[align=left]
[/align]
[align=left]通过Chrome调试可以观察到[/align]
[align=left][/align]
[align=left]看到这个的时候,突然觉得这2个东西好像是一样的,仅仅只是其中一个多了name,[/align]
[align=left]所以我先假设了一个结论,普通函数就相当于没有公共属性和公共方法的构造函数![/align]
[align=left]
[/align]
为了验证这个假设,可以先试试将构造函数用调用普通函数那样的方式去调用,比如上面这个PT(),我们一般这样调用
var pt = PT();//普通
用构造函数试试
var gz=GZ();//构造
所以将构造函数当做普通函数用是没有问题的!
那么反过来呢?上面说到普通函数就相当于没有公共属性和公共方法的构造函数!
这里说到了公共属性和公共方法,因为我刚开始学JS,不知道这样的描述正不正确,C#里面叫做属性和方法,我们暂且这样叫吧
我们把上面的函数改造一下
[align=left] function PT() {[/align]
var name =
"普通" ;
[align=left] var age = 10;[/align]
[align=left]
[/align]
[align=left] var getName=function () {[/align]
[align=left] alert(name);[/align]
[align=left] }[/align]
[align=left]
[/align]
[align=left] var getAge=function () {[/align]
[align=left] alert(age);[/align]
[align=left] }[/align]
[align=left]
[/align]
[align=left] return name;[/align]
[align=left] }[/align]
[align=left]
[/align]
[align=left] function GZ() {[/align]
this .name =
"构造" ;
[align=left] var age = 20;[/align]
[align=left]
[/align]
this .getName=
function () {
[align=left] alert(name);[/align]
[align=left] }[/align]
[align=left]
[/align]
[align=left] var getAge=function () {[/align]
[align=left] alert(age);[/align]
[align=left] }[/align]
[align=left]
[/align]
[align=left] return name;[/align]
[align=left] }[/align]
[align=left]
[/align]
[align=left]再测试一下[/align]
var pt =
new PT();
var gz =
new GZ();
[align=left] alert("pt:name=" + pt.name +",age=" + pt.age); //pt:name=undefined,age=undefined[/align]
[align=left] //pt.getName(); //pt.getNameis not a function[/align]
[align=left] //pt.getAge(); //pt.getAgeis not a function[/align]
[align=left] alert("gz:name=" + gz.name +",age=" + gz.age); //gz:name=构造,age=undefined[/align]
[align=left] gz.getName();[/align]
//gz.getAge();
//gz.getAge
is not a function
[align=left][/align]
从上面的结果可以看出和我们之前得出的结论一样,即便是在构造函数里,也不是所有的都能访问。
相关文章推荐
- JQuery1——基础($对象,选择器,对象转换)
- Android学习笔记(二九):嵌入浏览器
- Android java 与 javascript互访(相互调用)的方法例子
- JavaScript演示排序算法
- javascript实现10进制转为N进制数
- 最后一次说说闭包
- Ajax
- 2019年开发人员应该学习的8个JavaScript框架
- HTML中的script标签研究
- 对一个分号引发的错误研究
- 异步流程控制:7 行代码学会 co 模块
- ES6 走马观花(ECMAScript2015 新特性)
- JavaScript拆分字符串时产生空字符的原因
- Canvas 在高清屏下绘制图片变模糊的解决方法
- Redux系列02:一个炒鸡简单的react+redux例子
- JavaScript 各种遍历方式详解