`
shengren0
  • 浏览: 22198 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

js 杂项

 
阅读更多
  1. Arguments对象有一个callee属性,标示了当前Arguments对象所在的方法。
    可以使用它来实现匿名函数的内部递归调用。修改Arguments对象的length属性并不会改变它的长度。
    function(x) {     
        if (x <= 1) return 1;     
        return x * arguments.callee(x-1);     
    }
  2. 每一个函数都包含了一个prototype(原型)属性,这个属性构成了javascript面向对象的核心基础
  3. 使用new运算符调用构造函数时,在执行第一行代码前先创建一个对象,只有this才能访问这个对象,将新的空对象设置为该函数中“this”的值。 默认情况下该对象是构造函数的返回值,不必明确使用return。
  4. 在javascript中,每个对象都有一个prototype属性,这个属性指向了一个prototype对象。"原型对象"和"原型属性"是两个不同的概念。当创建了空对象后,new会接着操作刚生成的这个对象的prototype属性。
    每个方法都有一个prototype属性(因为方法本身也是对象)。new操作符生成的新对象的prototype属性值和构造方法的prototype属性值是一致的。构造方法的prototype属性指向了一个prototype对象,这个prototype对象初始只有一个属性constructor(这是Object的prototype),而这个constructor属性又指向了prototype属性所在的方法。

    当用构造函数创建一个新的对象时,它会获取构造函数的prototype属性所指向的prototype对象的所有属性。对构造函数对应的 prototype对象所做的任何操作都会反应到它所生成的对象身上,所有的这些对象共享构造函数对应的prototype对象的属性。


  5. 用prototype模拟继承
    function Circle(radius) {  //定义父类Circle     
        this.radius = radius;     
    }     
    Circle.prototype.area = function() { //定义父类的方法area计算面积     
        return this.radius * this.radius * 3.14;     
    }     
        
    function PositionCircle(x,y,radius) { //定义类PositionCircle     
        this.x = x;                    //属性横坐标     
        this.y = y;                    //属性纵坐标     
        Circle.call(this,radius);      //调用父类的方法,设置PositionCircle类的radius属性   相当于super()  
    
    
    
    }     
    PositionCircle.prototype = new Circle(); //设置PositionCircle的父类为Circle类,将Circle中的所有属性,包括prototype都继承都PositionCircle中。
        
    var pc = new PositionCircle(1,2,1);     
    alert(pc.area());  //3.14     
                       //PositionCircle类的area方法继承自Circle类,而Circle类的     
                       //area方法又继承自它的prototype属性对应的prototype对象     
    alert(pc.radius); //1  PositionCircle类的radius属性继承自Circle类     
        
    /*   
    注意:在前面我们设置PositionCircle类的prototype属性指向了一个Circle对象,   
    因此pc的prototype属性继承了Circle对象的prototype属性,而Circle对象的constructor属   
    性(即Circle对象对应的prototype对象的constructor属性)是指向Circle的,所以此处弹出   
    的是Circ.   
    */    
    alert(pc.constructor); //Circle         
        
    /*为此,我们在设计好了类的继承关系后,还要设置子类的constructor属性,否则它会指向父类   
    的constructor属性   
    */    
    PositionCircle.prototype.constructor = PositionCircle     
    alert(pc.constructor);  //PositionCircle 
     
  6. 返回函数的函数就是个典型的闭包,函数中的变量不能被外界修改,只能通过调用返回的函数(定义在函数内部的函数)进行修改
    function temp() {     
        var i = 0;     
        function b() {     
            return ++i;     
        }     
        return b;     
    }     
    var getNext = temp();     
    alert(getNext());    //1     
    alert(getNext());    //2
     
  7. 作用域链
    在javascript解释器启动时,会首先创建一个全局的对象(global object),也就是"window"所引用的对象。然后我们定义的所有全局属性和方法等都会成为这个对象的属性。不同的函数和变量的作用域是不同的,,因而构成了一个作用域链(scope chain)。很显然,在javascript解释器启动时,这个作用域链只有一个对象:window(Window Object,即global object).
    在上面的闭包示例中,由于temp函数是一个全局函数,temp()函数的作用域(scopr)对应的作用域链就是js解释器启动时的作用域链,只有一个window对象。当temp执行时 ,首先创建一个call object(活动对象),然后把这个call object添加到temp函数对应的作用域链的最前面,这时,temp()函数对应的作用域链就包含了两个对象:window对象和temp函数对应的call object,temp函数中的变量i、函数b()都会成为call object的属性。
    js的函数是词法性的:函数是运行在定义他们的作用域中(b函数运行在temp函数的作用域中,因此可以引用到temp作用域中定义的变量),而不是调用他们的作用域中。 只要b函数被定义在temp中,b就可以访问temp函数定义的所有变量,即使temp函数已经执行完毕

    而在函数b的作用域链中,b对应的call object中却没有变量i,只有argments属性,这是因为变量i不是在函数b中定义的(没有使用var来声明),只有用var 关键字声明的属性才会添加到对应的call object上。在函数执行时,首先查找对应的call object有没有需要的属性,如果没有,再往上一级查找,直到找到为止,如果找不到,那就是undefined了.
  8. 用闭包模拟私有变量
    function Person(name, age) {       
        this.getName = function() { return name; };       
        this.setName = function(newName) { name = newName; };       
        this.getAge = function() { return age; };       
        this.setAge = function(newAge) { age = newAge; };       
    }       
           
    var p1 = new Person("sdcyst",3);       
    alert(p1.getName());  //sdcyst       
    alert(p1.name);       //undefined   因为Person类没有name属性       
    p1.name = "mypara"    //显示的给p1添加name属性       
    alert(p1.getName());  //sdcyst     但是并不会改变getName方法的返回值       
    alert(p1.name);       //mypara     显示出p1对象的name属性       
    p1.setName("sss");    //改变私有的"name"属性     
    alert(p1.getName());  //sss       
    alert(p1.name);       //仍旧为mypara
     

 

分享到:
评论

相关推荐

    JavaScript杂项集合

    这个"JavaScript杂项集合"包含的可能是一系列关于JavaScript的知识点、代码示例或者手册,帮助开发者理解和掌握这一强大的工具。 1. **基础概念**:JavaScript基于ECMAScript规范,是一种解释型、弱类型、动态类型...

    JS相关杂项

    JS相关的杂项知识涵盖了许多方面,下面我们将深入探讨一些关键知识点。 1. **变量与数据类型**:JavaScript中的变量是动态类型的,使用`var`, `let`, 或 `const` 定义。基本数据类型包括字符串(String)、数字...

    pinyin4js是一个汉字转拼音的Javascript开源库

    “pinyin4js是一个汉字转拼音的Javascript开源库”表明这是一个JavaScript库,它的主要功能是将汉字转换为对应的拼音表示。在网页应用或者JavaScript编程中,这样的库可以帮助开发者处理与汉字拼音相关的任务,比如...

    convertjs一个简单的JavaScript转换库

    标签"JavaScript开发-其它杂项"表明这个库是JavaScript生态系统的一部分,特别适用于那些在项目中需要进行各种杂项转换任务的开发者。"其它杂项"可能意味着该库包含各种各样的转换功能,涵盖了开发过程中可能遇到的...

    基础密码学与杂项

    课程目标 •掌握密码学的基本概念 •掌握常见的加解密算法的原理 •掌握隐写术的概念与相对应的解密方法 知识大纲 ...•对称与不对称加密 •摘要算法 •常见的编码解码 ...•常见的JS的加解密 •JS混淆 •JSfuck •Jother

    js_testing:JS 的杂项

    在本主题"JS的杂项"中,我们将探讨JavaScript在实际应用中的各种技术和概念,这些内容广泛且深入,涵盖了从基础语法到高级特性的多个方面。 首先,我们要了解JavaScript的基础。JS是基于ECMAScript标准的,它包括...

    Node.js-TensorFlowNode.js为Node.js用户提供惯用的JavaScript语言绑定和高层API

    Node.js是一款基于Chrome V8引擎的JavaScript运行环境,它让JavaScript可以在服务器端执行,极大地拓宽了JavaScript的应用领域。而TensorFlow是谷歌开发的一款开源机器学习框架,它允许开发者构建、训练和部署各种...

    downloadjs通过javascript触发文件下载

    本文将深入探讨如何使用`downloadjs`库或者其他纯JavaScript方法来触发文件下载。 **1. HTML5的download属性** 在HTML5中,`&lt;a&gt;`标签新增了一个`download`属性,允许开发者指定一个链接应该下载而不是在新窗口中...

    Node.js-GitKit.js纯JavaScript实现的Git(支持Node.js和浏览器)

    GitKit.js是一个强大的开源库,它实现了Git的纯JavaScript版本,允许在Node.js环境中以及现代浏览器中使用Git功能。这个库使得开发者无需依赖其他系统工具,就能在JavaScript应用中直接处理Git操作,如克隆、拉取、...

    杂项:杂项文件

    5. **代码文件**:如.js、.py、.java、.cpp等,用于编写软件和应用程序。这些文件是编程和软件开发的基础。 6. **配置文件**:如.ini、.xml、.json,用于存储程序的设置和配置信息,帮助软件适应用户需求。 7. **...

    threejs一个易于使用的轻量级的JavaScript3D库

    "JavaScript开发-其它杂项"标签表明Three.js是JavaScript开发中的一个工具,可能用于各种不同的应用场景,包括但不限于游戏开发、数据可视化、虚拟现实(VR)或增强现实(AR)体验等。 **文件名称解析:** "mrdoob-...

    wast2js将WebAssemblywat文件编译成一个公共的JS模块

    总的来说,`wast2js`是JavaScript开发者利用WebAssembly性能优势的一个桥梁,通过将WebAssembly文本格式转换为JavaScript模块,使得开发者能够在JavaScript环境中无缝地集成和执行高性能的WebAssembly代码。...

    statisticsjs用于统计数据分析的扩展开源JavaScript库

    "JavaScript开发-其它杂项" 这个标签告诉我们这个库是JavaScript开发者可能感兴趣的一个工具,属于JavaScript开发类别中的非主流或者多用途工具,可能包含了一些不太常见但实用的功能。 **文件名称解析:** ...

    Node.js-使用node做server的基础脚手架基于egg.js

    Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境,它让开发者能够在服务器端使用 JavaScript 进行编程,极大地推动了全栈开发的流行。Egg.js 是一个由阿里云开发的企业级 Node.js 框架,旨在提供一套高效...

    Node.js-CosmicJS实现的一个简单的Node.js登陆页面

    标签“Node.js开发-其它杂项”表明这个项目涵盖了Node.js开发的一些通用知识,可能涉及到的其他主题可能包括错误处理、中间件使用、安全实践(如密码哈希和验证)、以及可能的用户认证和授权策略。 总的来说,这个...

    Node.js-Node.js机器人平台

    Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境,它让开发者能够使用 JavaScript 在服务器端编写可伸缩的网络应用。这个“Node.js-Node.js机器人平台”项目,显然旨在利用 Node.js 的特性来构建智能机器...

    Platformjs一个平台检测JavaScript库适用于几乎所有的平台

    Platform.js 是一款强大的JavaScript库,专为检测运行环境而设计,它能帮助开发者准确识别用户所使用的操作系统、浏览器版本、设备特性等信息。这个库尤其适用于跨平台的Web应用开发,确保你的代码能在各种不同的...

    NLPjs一个nodejsjavascript自然语言处理库

    5. **其它杂项**:除了核心的NLP功能外,NLP.js可能还包括一些额外的工具或模块,如文本预处理(去除停用词、标点符号等)、关键词提取、语义相似度计算等。这些附加功能使得NLP.js成为一个全面的解决方案,满足...

    webpjs是一个用于webp检测的库

    3. **JavaScript开发中的其他杂项** - **兼容性处理**:在实际应用中,开发人员可能需要根据WebP的支持情况动态加载不同格式的图片,以确保所有用户都能看到内容。这可以通过JavaScript进行条件判断和图片切换来...

    一个在手机网页端可以直接调用原生分享的js

    标签"JavaScript开发-其它杂项"表明这个库主要适用于JavaScript开发者,特别是一些需要处理网页中非核心功能但又不可或缺的细节,如分享按钮。对于那些不熟悉原生平台API的前端开发者来说,`nativeShare.js`是一个...

Global site tag (gtag.js) - Google Analytics