博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
深入理解Javascript中this, prototype, constructor
阅读量:6232 次
发布时间:2019-06-21

本文共 4038 字,大约阅读时间需要 13 分钟。

在Javascript面向对象编程中经常需要使用到this,prototype和constructor这3个关键字.

1.首先介绍一下this的使用:this表示当前对象;如果在全局中使用this,则this为当前页面对象window;如果在函数中使用this,则this为调用该函数的对象;可以使用apply和call两个全局函数来改变this的指向。

接下来,首先通过几个demo程序验证一下:

function testFunction(){    console.log(this.variable);};var variable='Global Variable';testFunction();var packObject={variable:'Pack variable',testFunction:testFunction};packObject.testFunction();
View Code

接下来通过Demo验证一下如何使用apply和call函数来改变this的指向:

function testFunction(){    console.log(this.variabale);};var variable='Global Variable';var packObject={variable:'Pack Variable'};testFunction.apply(window);testFunction.apply(packObject);testFunction.call(window);testFunction.call(packObject);
View Code

接下来在通过Demo演示一下函数对象的使用:

function testFunction(){    if(this===window){        console.log('This is window');    }};testFunction.innerFunction=function(){    if(this===testFunction){        console.log('This is testFunction');    }    if(this===window){        console.log('This is window');    }};////// 等价于:window.testFunction();///testFunction();testFunction.innerFunction();testFunction.innerFunction.apply(window);testFunction.innerFunction.call(window);
View Code

2.接下来介绍一下什么是原型(prototype):

prototype本质上还是Javascript的一个对象;每个函数都有一个默认的prototype属性;通过prototype可以扩展Javascript中的内建对象。

接下来通过Demo展示一下如何使用prototype:

function Person(name){    this.name=name;};Person.prototype={    getName:function(){        return this.name;    }};var testPerson=Person('test name');console.log(testPerson.getName());
View Code

让我们来尝试一下如何使用prototype扩展Javascript内建对象:

Array.prototype.min=function(){    var min=this[0];    for(var index=0;index
View Code

这个地方有个坑,当对Array进行扩展后,使用for-in循环会将数组循环出来

通过代码demo一下该陷阱(假设已经向Array扩展了min方法):

var arr=[2,4,3,6];var total=0;for(var i in arr){    total+=parseInt(arr[i],10);}console.log(total);
View Code

通过demo程序演示一下如何解决该问题:

var arr=[2,4,6,3];var total=0;for(var i in arr){    if(arr.hasOwnProperty(i)){        total+=parseInt(arr[i],10);    }}console.log(total);
View Code

3.接下来介绍一下什么是构造器(Constructor): a.constructor始终指向创建当前对象的构造(初始化)函数 b.每个函数都有一个默认的prototype属性,而这个prototype属性的constructor指向该函数

然后通过程序实例demo一下:

////// 等价于 var arr=new Array(2,4,6,5);///var arr=[2,4,6,5];console.log(arr.constructor===Array);    //true////// 等价于 var Foo=new Function();///var Foo=function(){};console.log(Foo.constructor===Function);    //truevar obj=new Foo();console.log(obj.constructor===Foo);        trueconsole.log(obj.constructor.constructor===Function);    true
View Code

当constructor遇到prototype时,就会发生一种一下情况:

有上述可以知道每个函数都有默认的属性prototype,而这个默认的额prototype属性的constructor指向该函数

function Person(name){    this.name=name;};Person.prototype.getName=function(){    return this.name;};var obj=new Person('test person');console.log(obj.constructor===Person);        //trueconsole.log(Person.prototype.constructor===Person);        //trueconsole.log(obj.construtor.prototype.constructor===Person);        //true
View Code

当我们重新定义prototype时,就会出现一个很奇怪的现象(以下实例是覆盖,上述实例是修改),constructor就会有所不同

function Person(name){    this.name=name;};Person.prototype={    getName:function(){        return this.name;    }};var obj=new Person('test person');console.log(obj.constructor===Person);        //falseconsole.log(Person.prototype.constructor===Person);        //falseconsole.log(obj.construtor.prototype.constructor===Person);        //false
View Code

以下简单分析一下出现该现象的原因,覆盖操作等价于以下代码:

Person.prototype = new Object({getName:function () {       return this.name;   }});
View Code

而constructor始终指向创建自身的函数,因此Person.prototype.constructor===Object

我们可以通过重新覆盖construtor来解决该问题:

function Person(name) {       this.name = name;   };   Person.prototype = new Object({getName:function () {       return this.name;   }});   Person.prototype.constructor = Person;   var obj = new Person("test person");   console.log(obj.constructor === Person);        // true   console.log(Person.prototype.constructor === Person);    // true   console.log(obj.constructor.prototype.constructor === Person);    // true
View Code

 

转载于:https://www.cnblogs.com/chengbing2011/p/4202944.html

你可能感兴趣的文章
ranger安装hbase插件_ranger的配置与使用
查看>>
mysql模板文件_MySQL 配置文件模板
查看>>
mysql连接数据库测试连接成功_java连接mysql数据库及测试是否连接成功的方法
查看>>
1×pbs缓冲液配方_PBS缓冲液配方.doc
查看>>
mysql qadir_MySQL 及 SQL 注入
查看>>
python 播放视频 ftp_视频在通过Python ftplib上传时出现损坏
查看>>
python3 image_python docker快速入门3制作image
查看>>
python代码写名字_【python】【名字】是什么?,Pythonname
查看>>
python调用浏览器生成dom_1分钟快速生成用于网页内容提取的xslt
查看>>
tolua unity 报错_关于LUA+Unity开发_toLua篇【二】
查看>>
java this函数_java this 用法详解
查看>>
java怎么封装表单数据_java 对form表单数据进行封装list
查看>>
java 当前工作目录是指_java取得当前工作目录
查看>>
the java jive_Java Jive
查看>>
hadoop上传文件java_hadoop入门之通过java代码实现将本地文件上传到hadoop的文件系统...
查看>>
放苹果 java_用Java代码模拟实现:一个人不断往箱子里放苹果,另一个人不
查看>>
java ftp 判断目录存在_java判断ftp目录是否存在的方法
查看>>
java httpclient 进度条_如何获得一个文件的上传与Apache HttpClient的4进度条
查看>>
java获取指定日期的后一天_java获得指定日期的前一天,后一天的代码详解
查看>>
java反射工具类_反射和BeanUtils工具类的使用
查看>>