用实例谈谈javascript中的this和prototype

本文通过几个实例谈谈js中一些基础概念的问题。首先回顾一下js这门语言的特点:除了对象什么都没有。函数在js语言中被看作一种特殊的数据类型,特殊在包含代码并且可以执行,但落点在它是一种数据类型,与数字、字符串等一样。

   理解了这个,那么js语言中的全局作用域和函数作用域、全局变量和局部变量。可以通过全局对象和非全局对象划分。如果函数或其他数据类型,不依托非全局变量,那么就默认依托全局变量,即作为全局对象的属性或方法,否则被当作局部对象方法或属性。this被用作指向属性和方法所依托的对象。搞清楚了这个,this的判断就基本上不会出现问题了。

   以下实例(点击查看)为第七个内容的实例。

var x = 100;
var y=77;
var a1={
x:99,
xx:function(){
  //var y=88;  //如果没有注释这个变量,y将是全局变量的77
  alert(y); //没有使用this指针,调用函数的对象无法影响y的值,函数运行时将从这里按作用域链逐级搜索取值
  alert(this.x);  //使用了 this 指针,调用函数的
}
}

a1.xx();
a1.xx.call(window);

var jj = a1.xx;

jj(); //效果跟a1.xx.call(window); 一样

以上代码,倒数第三、四行代码都不难理解,倒数第一行代码怎么理解呢?首先我们看jj定义在全局对象中,即jj是window的属性,从jj的赋值我们知道,jj是一个方法,jj()也就相当于window.jj(),即调用函数的this指向全局对象window。

   如下代码是回复一个网友提问的解答:

function A()
{
 this.d=5;
 this.c=5;
}
A.prototype.name="father";
var a= new A();//构造函数会给创建的实例添加所有属性和方法包括自有属性和prototype的属性
var b={};
A.call(b);//apply和call方法只会返回对象的自有属性,prototype属性都会丢弃
/*如下四种实例可证*/
console.log(a.d);
console.log(b.d);
console.log(a.name);
console.log(b.name);

call和apply函数都可以改变this指针的指向,但是prototype属性会被丢弃掉,通过实例不难验证。

  如下代码是对一个网友算法(点击查看)的优化,同时也是prototype属性的应用。函数对象的属性prototype,此属性初始值为boject空对象。可以给作为原型属性的这个对象添加属性和方法。函数对象作为构造器函数生成新对象,可用prototype属性添加的属性和方法。

   原型链概念:当构造器生成新对象,这个对象查找对象属性时,先找对象属性,如果没有则上溯到原型中查找,直到查找到object。对象自身属性优先级高于原型属性。可以覆盖。

   下述代码旨在删除数组中重复的内容,用到了prototype属性,给内建Array对象添加了新的方法。算法优化在于遍历和替代同时进行,遍历完,也替代完,并截取替代长度即可,减少了时间复杂度。

 Array.prototype.uniq = function() {// 利用原型属性,给内建对象添加新的方法剔除重复字符串
        var temp={},k=0,m,tempA=[];
        for(var i=0; i < this.length; i++)  {
            if(temp[this[i]] == undefined)//这里的undefined要注意,没有引号
            {
		m=k;
		temp[this[i]]=1;
		this[k++]=this[i];
            }
        }
        this.length=k;
        return this;
    }  

var array= [1,‘a‘,1,‘a‘,‘kl‘,"name","karl",‘kl‘];
array.uniq()

用实例谈谈javascript中的this和prototype

时间: 2024-11-10 16:22:24

用实例谈谈javascript中的this和prototype的相关文章

JavaScript的数据类型都有什么? JavaScript中 toStirng() 与 Object.prototype.toString().call()

JavaScript的数据类型都有什么? (via  BAT互联网公司2014前端笔试面试题:JavaScript篇  http://www.sxt.cn/u/756/blog/4508) 基本数据类型:String,boolean,Number,Undefined, Null 引用数据类型: Object(Array,Date,RegExp,Function) 疑问:这些基本的数据类型的值都是常量,而常量是没有方法的,为什么能够调用方法呢?答案是这样的,五种基本类型除了null.undefin

谈谈javascript中的日期Date对象

一.日期对象??在javascript中并没有日期型的数据类型,但是提供了一个日期对象可以操作日期和时间.??日期对象的创建:??new Date();二.将日期对象转换为字符串??将日期对象转换为字符串可以使用以下4种方法:??date.toString();//将日期对象转换为字符串时,采用的是本地时间??date.toLocalString();//将日期对象转换为字符串,采用的是本地时间,显示的是地方日期的格式??date.toUTCString();//将日期对象转换为字符串时,采用的

Javascript中的继承与Prototype

之前学习js仅仅是把w3school上的基本语法看了一次而已,再后来细看书的时候,书中会出现很多很多没有听过的语法,其中一个就是js的继承以及总能看到的prototype.我主要在看的两本js书是<javascript权威指南>,也就是那本犀牛书,还有一本是疯狂xx系列的<疯HTML5/CSS3/Javascript讲义>.前者非常适合用啃js细节,如果需要深入学习一些js内部机制以及相关的内容,这本大块头啃起来还是挺有味道的.后者是本速成教材,可以让你对某个概念有一个非常舒服的打

javascript中的this与prototype,原型理解

JavaScript 函数调用 JavaScript 函数有 4 种调用方式. 每种方式的不同方式在于 this 的初始化. this 关键字 一般而言,在Javascript中,this指向函数执行时的当前对象.   注意 this 是保留关键字,你不能修改 this 的值. 全局对象 当函数没有被自身的对象调用时, this 的值就会变成全局对象. 在 web 浏览器中全局对象是浏览器窗口(window 对象). 该实例返回 this 的值是 window 对象: 1作为一个函数调用 实例

【转】JavaScript中的constructor与prototype

最初对js中 object.constructor 的认识: 在学习JS的面向对象过程中,一直对constructor与prototype感到很迷惑,看了一些博客与书籍,觉得自己弄明白了,现在记录如下: 我们都知道,在JS中有一个function的东西.一般人们叫它函数.比如下面的代码 function Person(name)   {     alert(name);   }   Person('js');//js 上面的代码中,Person的表现的确跟一般的函数没有什么区别,接着看下面的代码

JavaScript中toStirng()与Object.prototype.toString.call()方法浅谈

toStirng()与Object.prototype.toString.call()方法浅谈 一.toString()是一个怎样的方法?它是能将某一个值转化为字符串的方法.然而它是如何将一个值从一种类型转化为字符串类型的呢? 通过下面几个例子,我们便能获得答案: 1.将boolean类型的值转化为string类型: console.log(true.toString());//"true" console.log(false.toString());//"false&quo

理解javascript中的原型模式

一.为什么要用原型模式. 早期采用工厂模式或构造函数模式的缺点:  1.工厂模式:函数creatPerson根据接受的参数来构建一个包含所有必要信息的person对象,这个函数可以被无数次的调用,工厂模式尽管解决了创建多个相似对象的问题,却没有解决对象识别的问题(返回的是自定义的一个对象o,不明确对象o的类型).  2. 构造函数模式:构造函数的调用和其他oo语言一样,用new操作符来构建一个Person的实例:javascript中的构造函数也是函数(所以也可以直接像普通函数那样直接调用方法名

Javascript中常见的10大面试题及答案

在IT界中,JavaScript开发人员的需求量一直居高不下.如果你的能力能够胜任这一角色,那么你有很多机会换一家公司,并提高薪水.但在你被一家公司聘用之前,你必须展示你的技能,以通过面试环节.在本文中,我将向您展示10个 JavaScript 技能典型问题以及其相关解决方案,来面试前端工程师.它们很有意思! 问题1: 作用域(Scope) 考虑以下代码: (function() { var a = b = 5; })(); console.log(b); 控制台(console)会打印出什么?

JavaScript中字符串分割函数split用法实例

这篇文章主要介绍了JavaScript中字符串分割函数split用法,实例分析了javascript中split函数操作字符串的技巧,非常具有实用价值,需要的朋友可以参考下 本文实例讲述了JavaScript中字符串分割函数split用法.分享给大家供大家参考.具体如下: 先来看下面这段代码: <script type="text/javascript"> var str="How are you doing today?" document.write